2016-05-06 43 views
1

是否可以將這兩個左連接合併爲一個?將同一個表上的兩個左連接合併爲一個

我想不出任何辦法

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

+0

@ gofr1我會在星期一看看,到目前爲止,內聯窗口函數似乎做 – Fredou

回答

1

您可以使用max() over(),讓每somefield場2的最大值在相同的查詢。

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

缺少小組我建議您嘗試您的查詢和我的然後評論。 –

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

它給我這個錯誤;窗口函數只能出現在select或order by子句中。所以它似乎是一個無效的查詢 – Fredou

+0

是啊!在WHERE子句中忘記ROW_NUMBER()是不可能的。我改變了答案:) – gofr1