为什么LEFT JOIN在一个字段上然后在WHERE子句中将其过滤掉?

AK9*_*K91 2 sql t-sql sql-server left-join where-clause

询问

SELECT ID, Name, Phone 
FROM Table1 
LEFT JOIN Table2 ON Table1.ID = Table2.ID
WHERE Table2.ID IS NULL
Run Code Online (Sandbox Code Playgroud)

问题

  • 发现很难理解为什么有人会在ID上留下联接然后在where子句中将其设置为NULL?
  • 我在这里错过了什么吗?这有什么意义吗?
  • 我们可以Table2完全省略吗?因为根本没有加入?

任何帮助将非常感激.

Zoh*_*led 5

您在问题中的查询基本上等同于以下查询:

SELECT ID, Name, Phone 
FROM Table1 
WHERE NOT EXISTS
(
    SELECT 1
    FROM  Table2 
    WHERE Table1.ID = Table2.ID
)
Run Code Online (Sandbox Code Playgroud)

这意味着它选择Table1中表2中没有相关记录的所有记录.

两个查询的执行计划很可能是相同的(就我个人而言,当他们制定不同的执行计划时,我从未见过这种情况,但我不排除这种情况),因此两个查询应该同样有效,并且它是由您来决定左连接或存在语法是否对您更具可读性.