为了解决我正在处理的查询问题,我删除了无关的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行的原因是什么?
答案 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
中的所有行,而不是TableD
,TableD
中是否匹配。因此,NULL
的三行是TableH
中TableD
中没有行的行。
你可能打算:
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;