2016-05-06 9 views
1

これらの2つの左結合を1つにマージすることは可能ですか?同じテーブルの2つの左結合を1つにマージする

私はあなたが同じクエリでsomefieldあたりのフィールド2の最大を取得するためにmax() over()を使用することができます任意の方法

select left1.field1, 
     left2.field2 
from masterTable left join (
    select somefield, 
     field1, 
     row_number() over (partition by somefield orderby otherfield) as rowNum 
    from childTable 
    inner join masterTable 
     on masterTable.somefield = childTable.somefield 
    ) as left1 
     on masterTable.somefield = left1.somefield 
       AND left1.rownum =1 
left join (
    select somefield, 
      max(field2) as field2 
    from childTable 
    inner join masterTable 
     on masterTable.somefield = childTable.somefield 
    where field3 = 1 
    group by somefield 
    ) as left2 
     on masterTable.somefield = left2.somefield 
+0

ねえ!私の答えをチェックしましたか?ちょうど:)私はこれまで、インラインウィンドウ関数は、仕事をしているように見える、月曜日に見てみましょうgofr1 @ – gofr1

+0

は、私が行っていたときに戻って、そのパターンをテストするつもりは、私の本当のクエリはもう少し面白い好奇心です – Fredou

答えて

1

を考えることはできません。

select left1.field1, 
     left1.field2 
from masterTable 
left join 
(select 
somefield,field1 
,row_number() over (partition by somefield orderby otherfield) as rowNum 
,max(field2) over(partition by somefield) as field2 
from childTable 
inner join masterTable on masterTable.somefield = childTable.somefield) as left1 
ON masterTable.somefield = left1.somefield 
AND left1.rownum =1 AND field3 = 1 
+0

句 – Fredou

+0

より複雑な私はあなたがあなたのクエリと私を試した後、コメントすることを示唆しています。 – Adi

+0

でグループをwork.missingするつもりはないという小さなサンプル –

0

これを試してみてください。..

select left1.field1, 
     left1.field2 
from masterTable 
left join 
(select 
somefield,field1 
,row_number() over (partition by somefield orderby otherfield) as rowNum 
,max(field2) over(partition by somefield) as field2 
from childTable 
inner join masterTable on masterTable.somefield = childTable.somefield 
group by somefield,field1 
,row_number() over (partition by somefield orderby otherfield) 

) 
as left1 
ON masterTable.somefield = left1.somefield 
AND left1.rownum =1 AND field3 = 1 
+0

なくてもいずれかを行うことがわけではない、それを評価する際に発生する必要がありますこのクエリは機能しません。 'group by'でウィンドウ関数を使うことはできません。 –

0

これを試してみてください、しかし、データと出力のサンプルをせずに私はそれはそれだけで推測だ、正常に動作することを保証することはできません。

SELECT field1, 
     MAX(field2) AS field2 
FROM (
    SELECT ct.field1, 
      ct1.field2, 
      ROW_NUMBER() OVER (PARTITION BY ct.somefield ORDER BY ct.otherfield) as rn 
    FROM masterTable mt 
    INNER JOIN childTable ct 
     ON mt.somefield = ct.somefield 
    LEFT JOIN childTable ct1 
     ON mt.somefield = ct1.somefield AND ct1.field3 = 1 
    ) as t 
WHERE rn = 1 
GROUP BY ct.field1 
+0

それは私にこのエラーを与える; windowed関数はselect節またはorder by節にしか現れません。それは無効なクエリだと思われる – Fredou

+0

うん! WHERE句でROW_NUMBER()を忘れた場合はできません。私は答えを変更:) – gofr1

関連する問題