来自Left JOIN的数据丢失

时间:2012-06-01 11:05:15

标签: sql sql-server left-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

对于表1中表2中不存在的行,我返回Col3为Null的行。当我基于Col3对数据进行分组时,如果我能以某种方式获得Col3的值而不是Null,那将是很好的.......

这可能吗?

所以我试图按col3的值返回col1和col2的每个可能组合。问题是当col3不包含col1,col2的特定组合时,我得到col3的空值...

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

LEFT JOIN将在右表中产生空值,其中左表中的Col1和Col2未找到匹配项。这是预期的行为。

如果您在编写其他查询时需要帮助,则必须发布数据结构和一些示例数据。

答案 2 :(得分: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