Çoğu veritabanı, ORDER BY
bir alt sorgudaki bir ya:
- İzin verilmiyor: Örneğin, SQL Server, Sybase SQL Anywhere (
TOP
veya ile tamamlanmadığı sürece OFFSET .. FETCH
)
- Anlamsız: Örneğin PostgreSQL, DB2 (
OFFSET .. FETCH
veya ile tamamlanmadığı sürece LIMIT
)
İşte DB2 LUW kılavuzundan bir örnek (benimkini vurgulayın)
Bir alt seçimdeki ORDER BY deyimi, bir sorgu tarafından döndürülen satırların sırasını etkilemez . ORDER BY deyimi, yalnızca en dıştaki tam seçimlerde belirtilirse döndürülen satırların sırasını etkiler.
İfadeler oldukça açık, tıpkı PostgreSQL'ler gibi :
Sıralama seçilmezse, satırlar belirtilmemiş bir sırada döndürülür. Bu durumda gerçek sıra, tarama ve birleştirme planı türlerine ve diskteki sıraya bağlı olacaktır, ancak buna güvenilmemelidir . Belirli bir çıktı sıralaması yalnızca sıralama adımı açıkça seçildiğinde garanti edilebilir.
Bu spesifikasyondan, ORDER BY
türetilmiş bir tablodaki maddeden kaynaklanan herhangi bir siparişin sadece tesadüfi olduğu ve beklenmedik siparişinizle (önemsiz örneğinizdeki çoğu veritabanında yaptığı) tesadüfen eşleşebileceği takip edilebilir, ancak buna güvenmek akıllıca olmaz bu.
DB2 ile ilgili yan not:
Özellikle, DB2 daha az bilinen bir özelliğe sahiptirORDER BY ORDER OF <table-designator>
, bu özellik aşağıdaki gibi kullanılabilir:
SELECT C1 FROM
(SELECT C1 FROM T1
UNION
SELECT C1 FROM T2
ORDER BY C1 ) AS UTABLE
ORDER BY ORDER OF UTABLE
Bu özel durumda, türetilmiş tablonun sıralaması, çoğu dış SEÇİM'de açıkça yeniden kullanılabilir
Oracle ile ilgili yan not:
Yıllardır Oracle'da , yalnızca türetilmiş bir tablo sipariş ettikten sonra makul bir şekilde hesaplanabilen OFFSET
sayfalandırma uygulamak bir uygulama olmuştur :ROWNUM
SELECT *
FROM (
SELECT rownum AS rn, t.* -- ROWNUM here depends on the derived table's ordering
FROM (
SELECT * FROM table ORDER BY time DESC
) t
) t
WHERE rn BETWEEN 10 AND 20
En azından ROWNUM
bir sorguda, gelecekteki Oracle sürümlerinin, henüz çok daha arzu edilebilir ve okunabilir SQL standart OFFSET .. FETCH
sözdizimi:
SELECT * FROM table ORDER BY time DESC OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY