2009-11-09 16 views
7

altında bir özel kayıt (kaydın birincil kimlik tarafından bulunur) üstte gösterecek bir sorguyu oluşturmaya çalışıyorum ve altındaki tüm diğer kayıtları görüntülemek, tarihe göre sıralı (birincil_ ekine ek olarak, tablodaki alanlardan biri olarak "date_added" ifadesine sahibim).SQL üstte belirli bir kayda sahip olmak için, tüm diğerleri

Bunu bir UNION ile yapabilirim (ilk seçim istediğim kaydı bulabilir ve diğer seçim tüm diğer kayıtları gösterir), ama belki de daha iyi bir yol olup olmadığını merak ediyorum.

Bu arada, Oracle kullanıyorum.

cevap

17

İki alan

göre sıralama yapabilirsiniz

satır istediğiniz bir veya 1 o yoksa herhangi 0 değerini döndüren bir ifade olurdu ilk 't. Sırala artan olacak, böylece önce tercih ettiğiniz kaydı elde edersiniz.

İkinci sıralama alanı date_added olur, böylece kalan kayıtlar bu sıraya göre sıralanır.

Korkarım basit bir şekilde iki ayrı şeyler göstermek ve bu nedenle basit sorguları ayırmak yazmak istiyorum tanımasını olurdu

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

Cevabınız için teşekkürler. "0'a göre sipariş ver" ne anlama geliyor? Bunu kendi başıma kullanamadığımı fark ettim, ör. sadece "0 BY ORDER". (Hatayı alıyorum: "SİPARİŞ BY öğe, bir SELECT-liste ifadesinin sayısı olmalıdır") – Dario

+1

'ORDER BY ' Oracle'da özel bir anlamı vardır, nth sütununda sıralanır. Tabii ki asla 0ncı sütun yok. CASE ile, her sıraya yeni bir sütun ekleyecek ve bunu sıralayacaktır. Yeni sütun eşleşen birincil anahtar için 1 ve diğer her yerde 0 olacaktır. – Andomar

1

Tam Oracle bilmiyorum ama belki böyle bir şey yapabileceğini ..

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

+1 Oracle'ın IF'yi bu şekilde destekleyip desteklemediğinden emin değil! – Andomar

+0

Oracle, IIF'yi desteklemiyor, ancak 'DECODE (id, THE_ID, 0,1) 'yerine – Andomar

7

daha kolay bir yolu yapı tarafından süslü bir düzen olacaktır. İşte pk için bir örnek = 123:

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

yazabilirsiniz, bu belirli bir kaydı sonlandırır," ... sonra 1 tane daha 2 ... "olmalıdır. –

+0

@ammoQ: Teşekkürler, cevabınız düzeltildi (reko_t daha önce aynı fikri paylaştı) – Andomar

-1

gibi sql sunucusunda olurdu bir şey tarafından kahini bilmiyorum. İlk kaydı almak için bir sorgu ve sıralı listeyi almak için ikinci. Tek bir kayıttan ötürü bundan daha fazlasını yapmak için gerçek bir performans avantajı yoktur.

+0

Evet, ancak bunu tek bir SQL deyimi olarak yapmanın avantajları vardır. Bazı ortamlar (ör. Raporlama takımları) SQL yapılarının yeniden kullanılmasına izin vermez, bu nedenle SQL'in çoğunu bakım için sorunlu olan iki kez tekrarlamak zorunda kalabilir. Ayrıca, SQL'de yapmak daha fazladır :-). – sleske

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

Başka *

seçme tarihe göre sıralanmış her şey takip 998 saniye

999 birinci aynı tekniği kullanarak üstüne birden fazla kayıt sıralayabilir

from the_table 
order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc 
İlgili konular