2016-05-06 14 views
1

Ist es möglich, diese 2 linken Join in einem zusammenführen?Verschmelzen von zwei linken Join auf derselben Tabelle zu einem

Ich kann nicht glauben, von irgendeiner Weise

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

Hey! Hast du meine Antwort überprüft? Nur neugierig :) – gofr1

+0

@ gofr1 Ich werde am Montag, schauen, bis die Inline-Fensterfunktion scheint den Job zu tun – Fredou

Antwort

1

Sie max() over() können Sie die max von field2 pro somefield in derselben Abfrage erhalten.

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

interessant, werde dieses Muster zu testen, zurück, wenn ich fertig bin, meine echte Abfrage ist ein bisschen mehr Komplex als das kleine Beispiel – Fredou

+0

es wird nicht funktionieren.Missing die Gruppe von Klausel – Adi

+0

Ich schlage vor, Sie versuchen, Ihre Abfrage und meine und dann kommentieren. –

0

Bitte versuchen, diese ..

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

sind Diese Abfrage wird nicht funktionieren. Sie können keine Fensterfunktion in 'group by' haben. –

0

diese versuchen, aber ohne Proben von Daten und Ausgabe-I kann nicht garantieren, dass es richtig funktioniert, ist es nur raten.

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

es gibt mir diesen Fehler; Fensterfunktion kann nur in den Select- oder Order-By-Klauseln erscheinen. so scheint es, es ist eine ungültige Abfrage – Fredou

+0

Yeah! Das Vergessen von ROW_NUMBER() in der WHERE-Klausel ist nicht möglich. Ich habe die Antwort geändert :) – gofr1

Verwandte Themen