Sql-Server
按父列排序的不同子行
我有一個查詢,我想在其中檢索不同的
Child
行,但按Parent
. 如果我執行以下操作,我會收到錯誤消息,因為列表ORDER BY
中未包含指定的DISTINCT
列:SELECT DISTINCT c.foo, c.bar FROM Parent p JOIN Child c on c.parentId = p.id ORDER BY p.createdDate
但是,如果我添加
p.createdDate
到選擇列表中,我將失去Child
行的獨特性,因為p.createdDate
它們都不同。如果我使用 CTE 或子查詢首先進行排序,然後從中選擇不同的行,則外部查詢不能保證它將保持內部/cte 查詢的順序。
有沒有辦法做到這一點?
您需要
GROUP BY
代替DISTINCT
(效果相同)並且需要聚合要用於排序順序的列。在這種情況下,我使用MIN
了 ,但您可以在這裡使用任何有意義的東西。SELECT c.foo, c.bar FROM Parent p JOIN Child c on c.parentId = p.id GROUP BY c.foo, c.bar ORDER BY MIN(p.createdDate);
請注意,由於您是按父表的列排序的,因此子表中的多行可能具有相同的 值
Parent.createdDate
,因此同一列中的排序順序createdDate
將是不可預測的。您需要從子表中添加至少一列以使排序順序可預測。