拡張ソートキー列
あなたがしたいことがうまくいかない理由は、SQLの操作の論理的な順序が原因です。これは、最初のクエリでは次のようになります(簡略化されています)。
FROM MonitoringJob
SELECT Category, CreationDate
つまり、いわゆる拡張ソートキー列を追加します
ORDER BY CreationDate DESC
SELECT Category
つまり、削除 、結果から拡張ソートキー列を再度ます。
それで、SQL標準のおかげで 拡張ソートキー列機能のSELECT
一時的にバックグラウンドで追加されているため、句に含まれていないもので並べ替えることは完全に可能です。
では、なぜこれが機能しないのDISTINCT
ですか?
我々は追加した場合DISTINCT
の動作を、それが間に追加されるだろうSELECT
とORDER BY
。
FROM MonitoringJob
SELECT Category, CreationDate
DISTINCT
ORDER BY CreationDate DESC
SELECT Category
しかし今、拡張ソートキー列を使用して CreationDate
を使用すると、DISTINCT
操作のセマンティクスが変更されたため、結果は同じではなくなります。これは私たちが望んでいることではないため、SQL標準とすべての妥当なデータベースの両方がこの使用を禁止しています。
回避策
次のように標準構文でエミュレートできます
SELECT Category
FROM (
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
) t
ORDER BY CreationDate DESC
または、単に(この場合は)Prutswonderでも示されているように
SELECT Category, MAX(CreationDate) AS CreationDate
FROM MonitoringJob
GROUP BY Category
ORDER BY CreationDate DESC
SQL DISTINCTとORDER BYについて詳しくは、こちらのブログを参照してください。