2017-07-05 53 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