2017-07-05 10 views
3

共通の親によって関連するchild1行のプロパティで注文された別のchild2行を取得するクエリがあります。私は次の操作を行う場合ORDERBYプロパティはDISTINCTリストにないので、私はエラーを取得する:私は選択リストにc1.Idを追加する場合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行の明瞭さを失うことになりますそれらはすべて異なっています。

CTEまたはサブクエリを使用して最初に注文を行い、それから別個の行を選択すると、外部クエリでは内部/ cteクエリの順序が維持されることは保証されません。

これを達成する方法はありますか?

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 
+0

テーブル構造を証明できますか? – jimmy8ball

+0

同じ 'c.foo' i' c.bar'と異なる 'p.createdate'を持つ2つの行がある場合、2つの' createdate'のどちらを使いたいのですか? –

+0

@Nenad子供のプライマリキーもありますが、それを例に追加します。 – GoatInTheMachine

答えて

0

インラインテーブルを使用パーティション(グループ)ごとに。 GROUP BYと同様に動作しますが、すべての列を返すことができます

3

私はその後ソートクエリに

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があるためPARTITION BY ...ROW_NUMBER().. = 1は、それが一つの行を選択する行を選択し、TOP(1) WITH TIESを使用してCTEの行が異なるする:

+0

「データ」から2番目の「外側」を選択しても、それ自体の注文ですか? CTEの発注を維持することが保証されているとは思いませんか? – GoatInTheMachine

+1

私はあなたの質問を断言しません。 'outer 'selectは' createdDate'だけでソートするために必要です。 CTEはソートを行っていません(私は 'select by distinct 'を選択するために' order by'を使います) –

+0

私はそれを見ていませんでした...それを試してみてください... – GoatInTheMachine

関連する問題