2012-06-01 20 views
0

我有兩個表,我留在一起。遺失的數據從左JOIN

SELECT Col3, tab1.Col1, tab1.Col2 FROM 
    (SELECT Col1,Col2 
    FROM Table1 
    GROUP BY Col1,Col2) tab1 
LEFT JOIN 
    (SELECT Col3, Col1, Col2 
    FROM Table2 
    GROUP BY Col3, Col1, Col2) tab2 
ON tab2.Col2 = tab1.Col2 AND tab2.Col1 = tab1.Col1 

對於Table1中不存在的表中的行,我返回Col3爲空的行。因爲我根據Col3對數據進行分組,所以如果我能以某種方式獲得Col3的值而不是空值,那將是一件好事。.....

這可能嗎?

所以我試圖返回col1和col2的每個可能的組合,每個col3的值。問題是當col3不包含col1,col2的特定組合時我得到col3的nulls ...

+0

添加了左連接標記 – cppcoder

+0

爲什麼使用'LEFT JOIN'? – Quassnoi

+0

您是否真的想爲Col1和Col2的每個組合顯示Col3的所有可能值,從而在Table2中找不到(col1,col2,col3)的零點?如果你這樣做,你應該解釋實際的表格。 –

回答

1

假設COL3是某種類型的,並且是category表的主鍵,你可以這樣做:

select Category.Col3, 
     tab1.Col1, 
     tab1.Col2, 
     sum (tab2.YourAggregate) SumOfSomething 
-- Take all categories 
    from Category 
-- Cartesian product with Tabl1 
cross join Table1 tab1 
-- Find matching records in Table2, if they exist 
    left join Table2 tab2 
    on Category.Col3 = Tab2.Col3 
    and Tab1.Col1 = Tab2.Col1 
    and Tab1.Col2 = Tab2.Col2 
group by Category.Col3, 
     tab1.Col1, 
     tab1.Col2 

Cross join產生涉及表的笛卡爾乘積,檢索可能不在表2中找到的Col3。

0

左邊的連接將在右邊的表中產生空值,在該區域中Col1和Col2找不到匹配左表。這是預期的行爲。

如果您在編寫其他查詢時需要幫助,則必須發佈數據結構和一些示例數據以供使用。

0

只需切換您的表(或使用右連接):

SELECT tab2.Col3, tab2.Col1, tab2.Col2 FROM 
    (SELECT distinct Col3, Col1, Col2 FROM Table2) tab2 
LEFT JOIN 
    (SELECT distinct Col1,Col2 FROM Table1) tab1 
ON tab2.Col2 = tab1.Col2 AND tab2.Col1 = tab1.Col1