请参阅下面的DDL:
CREATE TABLE TestTable(id int, [name] varchar(30))
CREATE TABLE TestTable2(id int, [name] varchar(30))
INSERT INTO TestTable (id,[name]) values (1,'')
INSERT INTO TestTable (id,[name]) values (2,'Martin')
INSERT INTO TestTable2 (id,[name]) values (1,null)
INSERT INTO TestTable2 (id,[name]) values (2,'Martin')
select TestTable.* from TestTable
LEFT JOIN TestTable2
ON TestTable.id=TestTable2.id
and TestTable.[name]= TestTable2.[Name] and NOT (TestTable.[name] ='' and TestTable2.[name] is null)
where testtable2.id is null
SELECT返回一行,我希望它不返回任何一行。我希望它返回none的原因与下面的SQL语句返回none的原因相同:
select TestTable.* from TestTable
LEFT JOIN TestTable2
ON TestTable.id=TestTable2.id
and TestTable.[name]= TestTable2.[Name]
where testtable2.id is null and NOT (TestTable.[name] ='' and TestTable2.[name] is null)
为什么第一个SQL语句返回一行? ON子句应该使用以下标准来记录这些记录:NOT(TestTable。[name] =''和TestTable2。[name]为null)。返回的一行包含此条件。为什么呢?
答案 0 :(得分:5)
LEFT JOIN
将返回左表中的所有行,除非它们被WHERE
条件过滤掉,您的第一个查询WHERE
条件排除了1行WHERE
在第二个查询中排除两行。
更新:理解联接的流行参考是:
的 Visual Representation of SQL Joins 强>
ON
用于定义表的连接方式,WHERE
以限制结果。在INNER JOIN
的情况下,它们都会限制结果,OUTER JOIN
它们之间的差异变得明显。