2009-11-09 23 views
7

Tôi cố gắng để đặt cùng một truy vấn mà sẽ hiển thị một bản ghi cụ thể (được tìm thấy bởi ID chính của kỷ lục) ở phía trên, và hiển thị tất cả các hồ sơ khác dưới nó, được sắp xếp theo ngày (Tôi có "date_added" là một trong các trường trong bảng, ngoài ID chính).SQL để có một bản ghi cụ thể ở phía trên, tất cả những người khác bên dưới

Tôi có thể làm điều này với UNION (lựa chọn đầu tiên sẽ định vị bản ghi tôi muốn và lựa chọn khác sẽ hiển thị tất cả các bản ghi khác), nhưng tôi tự hỏi liệu có cách nào tốt hơn không?

Tôi đang sử dụng Oracle, bằng cách này.

Trả lời

17

Bạn có thể làm điều này bằng cách sắp xếp theo hai lĩnh vực

Đầu tiên sẽ là một biểu thức trả về 0 nếu hàng là một trong những bạn muốn hoặc 1 nếu nó isn 't. Sắp xếp sẽ tăng dần để bạn có được bản ghi ưa thích trước tiên.

Trường loại thứ hai sẽ được DATE_ADDED nên các hồ sơ còn lại đều được sắp xếp theo thứ tự này.

Sợ tôi không biết oracle bởi trong máy chủ sql nó sẽ là một cái gì đó giống như

select * 
from the_table 
order by (case id when 999 then 0 else 1 end), date_added desc 
+0

Cảm ơn cho câu trả lời. gì "tự do 0" có nghĩa là, bằng cách này? Tôi đã nhận thấy rằng tôi không thể tự sử dụng nó, ví dụ: chỉ "ORDER BY 0". (Tôi nhận được lỗi: "ORDER BY mục phải là số của một biểu thức danh sách SELECT") – Dario

+1

'ORDER BY ' có một ý nghĩa đặc biệt trong Oracle, nó sẽ sắp xếp trên cột thứ n. Tất nhiên không bao giờ có cột thứ 0. Với CASE, nó sẽ thêm một cột mới vào mỗi hàng và sắp xếp trên đó. Cột mới sẽ là 1 cho khóa chính phù hợp và 0 ở mọi nơi khác. – Andomar

1

Tôi không biết Oracle chính xác, nhưng bạn có lẽ có thể làm điều gì đó như ..

ORDER BY IF(id == THE_ID, 0, 1), date_added 
+0

+1 Không chắc liệu Oracle có hỗ trợ IF theo cách đó hay không! – Andomar

+0

Oracle không hỗ trợ IIF, nhưng bạn có thể 'DECODE (id, THE_ID, 0,1) 'thay – Andomar

7

Một cách dễ dàng hơn sẽ là một thứ tự ưa thích bởi cấu trúc. Dưới đây là một ví dụ cho pk = 123:

select * 
from YourTable 
order by case when yourpk = 123 then 1 else 2 end, date_added 
+0

này sẽ đặt các bản ghi cụ thể để cuối cùng, cần được "... sau đó 1 khác 2 kết thúc ..." –

+0

@ammoQ: Cảm ơn, câu trả lời chỉnh sửa (reko_t gửi ý tưởng tương tự trước đó tho) – Andomar

-1

Cách đơn giản sẽ nhận ra rằng bạn muốn hiển thị hai việc riêng biệt và do đó viết để tách các truy vấn đơn giản. Một truy vấn để truy xuất bản ghi đầu tiên và bản ghi thứ hai để truy xuất danh sách được sắp xếp. Không có lợi thế thực sự thực sự để làm bất cứ điều gì nhiều hơn điều này vì một bản ghi duy nhất.

+0

Có, nhưng có những lợi thế để thực hiện nó như là một câu lệnh SQL đơn. Một số môi trường (ví dụ: các bộ báo cáo) không cho phép sử dụng lại dễ dàng các cấu trúc SQL, do đó, anh ta có thể phải lặp lại hầu hết các câu lệnh SQL hai lần, đây là vấn đề để bảo trì. Ngoài ra, làm điều đó trong SQL là nhiều consise :-). – sleske

0
SELECT * 
FROM `Table` 
ORDER BY (`id` = THE_ID) DESC, `date_added` DESC 
0

Bạn có thể sắp xếp nhiều hơn một kỷ lục về đầu trang bằng cách sử dụng kỹ thuật tương tự

999 đầu tiên 998 thứ hai tiếp theo mọi thứ khác được sắp xếp theo ngày

chọn *

from the_table 
order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc 
Các vấn đề liên quan