2017-07-05 18 views
3

我有一个查询,我想要检索不同的child2行,但排序的是由共同父项关联的child1行的属性。如果我这样做,我得到一个错误,因为ORDERBY财产在DISTINCT名单并不:SQL:选择按相关子项目属性排序的不同子项

select 
    distinct c2.Id, c2.Foo, c2.Bar 
    from Child1 c1 
    join Parent p on c1.parentId = p.Id 
    join Child2 c2 on c2.parentId = p.Id 
    order by c1.Id 

但是,如果我添加c1.Id的选择列表,我就失去了Child行清晰度,为c1.Id品牌他们全部不同。

如果我使用CTE或子查询先执行排序,然后从中选择不同的行,那么外部查询并不保证它将维护内部/ cte查询的顺序。

有没有办法做到这一点?

+0

请问您可以提供您的表格结构吗? – jimmy8ball

+0

所以,如果你有两行具有相同的'c.foo'我'c.bar'和不同的'p.createdate',你想使用哪两个'createdate'? –

+0

@Nenad也会有孩子的主键,我会将其添加到示例中 – GoatInTheMachine

回答

0

使用内联表:

Select DISTINCT t.foo, t.bar From 
    (SELECT 
    c.foo, c.bar, p.createdDate 
    FROM Parent p 
    JOIN Child c on c.parentId = p.id 
)t 
    ORDER BY t.createdDate 
3

我使用TOP(1) WITH TIES使行不同的CTE,那么在查询排序

WITH Data AS(
    SELECT TOP(1) WITH TIES 
     g.id, g.foo, g.bar, p.createdDate 
    FROM Parent p 
    JOIN Child c on c.parentId = p.id 
    JOIN Grandchild g on g.childId = c.id 
    ORDER BY ROW_NUMBER() OVER(PARTITION BY g.id, g.foo, g.bar ORDER BY p.createdDate) 
) 
SELECT * 
FROM Data 
ORDER BY createdDate 

TOP(1) WITH TIES选择其中ROW_NUMBER().. = 1。因为PARTITION BY ...的它选择一列的行每个分区(组)。它的作用类似于GROUP BY,但允许返回所有列

+0

虽然第二个'外部'不是从'数据'选择它自己的顺序吗?我不认为它能保证CTE的顺序? – GoatInTheMachine

+1

我不会拒绝你的问题。 'Outer'选择只需要'createdDate'进行排序。 CTE不提供任何排序​​(我使用'order by'去'选择不同的') –

+0

我的不好,没有看到...我会尝试它... – GoatInTheMachine