Sql-Server

按父列排序的不同子行

  • July 5, 2017

我有一個查詢,我想在其中檢索不同的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將是不可預測的。您需要從子表中添加至少一列以使排序順序可預測。

引用自:https://dba.stackexchange.com/questions/178056