除了期望的结果之外,左连接还返回三个空记录?

时间:2015-09-24 20:33:46

标签: sql ms-access-2007 left-join

为了解决我正在处理的查询问题,我删除了无关的SQL,并在两个表Left Join[TableH]之间留下了[TableD]个字符。惯例。 [TableH]包含A作为许多其他字段中的唯一标识符,[TableD]包含具有相同值A的多个记录。这是一个直观的例子:

TableH  
    A    |    B
111112   | Red
111113   | Red
111114   | Red
111115   | Blue
111116   | White

TableD  
    A    |    B    |   C..
111112   |  100    |  ....
111112   |  87     |  ....
111112   |  12     |  ....
111113   |  124    |  ....
111114   |  210    |  ....

当我运行以下查询时

SELECT 
    TD.*
FROM
    TableH AS TH
        LEFT JOIN 
        TableD AS TD
        ON TH.A = TD.A

我得到了TableD中所有~500,000个条目的预期结果,但我在结果中还得到了另外三行,这些行一直是空白/ NULL。

Query Results
    A    |    B    |   C..
         |         |  ....
         |         |  ....
         |         |  ....
111112   |  100    |  ....
111112   |  87     |  ....
111112   |  12     |  ....
111113   |  124    |  ....
111114   |  210    |  ....

额外3行的原因是什么?

3 个答案:

答案 0 :(得分:2)

左边的加入是怎么回事。它为左表(TableH)中的每一行创建了一行或多行,并且对于每一行,如果右表(TableD)中存在匹配,则填充值从该表中填写NULL。

在您的情况下,所有不匹配的ID在TD列中都包含NULL值的行,当您SELECT TD.*时,您会看到这些NULL。

答案 1 :(得分:1)

此查询:

SELECT TD.*
FROM TableH AS TH LEFT JOIN 
     TableD AS TD
     ON TH.A = TD.A;

返回TableH中的所有行,而不是TableDTableD中是否匹配。因此,NULL的三行是TableHTableD中没有行的行。

你可能打算:

SELECT TD.*
FROM TableD TD LEFT JOIN 
     TableH TH
     ON TH.A = TD.A;

答案 2 :(得分:-1)

您应该将查询更改为以下内容,将TableD引入FROM条款,因为您说SELECT TD.*

SELECT 
    TD.*
FROM TableD AS TD    
        LEFT JOIN 
        TableH AS TH ON TH.A = TD.A;