按父列排序的不同子行

Goa*_*ine 0 sql-server-2008 sql-server order-by t-sql distinct

我有一个查询,我想在其中检索不同的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
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加p.createdDate到选择列表中,我将失去Child行的独特性,因为p.createdDate它们都不同。

如果我使用 CTE 或子查询首先进行排序,然后从中选择不同的行,则外部查询不保证它将保持内部/cte 查询的顺序。

有没有办法实现这一目标?

spa*_*dba 6

您需要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);
Run Code Online (Sandbox Code Playgroud)

请注意,由于您按父表的列进行Parent.createdDate排序,因此子表中的多行可能具有相同的 值,因此同一行中的排序顺序createdDate将是不可预测的。您需要从子表中添加至少一列以使排序顺序可预测。