SQL Server / MS Access帮助了解nulls的子句在哪里,然后左JOIN



i具有以下MS访问生成的示例,用于在Table1上生成结果基础,而在IP地址列上匹配Table2。

SELECT 
    Table1.ID, Table1.IP_Address, Table1.Field1 
FROM 
    Table1 
LEFT JOIN
    Table2 ON Table1.[IP_Address] = Table2.[IP Address] 
WHERE 
    (((Table2.[IP Address]) IS NULL)); 

尝试分析"(((table2。[ip地址))为null))"我不明白这是有意义的,因为我将其解释为仅返回结果,而table2@ip地址为null。我对何处的询问和null的过滤器机制的理解是空白的。有人可以帮助我理解这种违反直觉的说法吗?

首先,编写查询的更直观的方法将使用 NOT EXISTS

SELECT Table1.ID, Table1.IP_Address, Table1.Field1 
FROM Table1
WHERE NOT EXISTS (SELECT 1 
                  FROM Table2 
                  WHERE Table1.[IP_Address] = Table2.[IP Address]
                 ); 

也就是说, LEFT JOIN方法是完全合理的 -

LEFT JOIN将所有行保存在第一个表(Table1)中,并在第二个表中匹配行。如果没有匹配项,则需要填充Table2列 - 对于不匹配,该值是NULL

WHERE子句仅保留这些NULL值。瞧!它将Table1中没有匹配值的行保持在Table2中。

您已经提到了答案:

生成table1上的结果,而不匹配table2

您使用LEFT JOIN,因此您可以从表中获取所有行,然后匹配和空(null)作为未加压的行,从表中。
来自表的无与伦比的行的Table2.[IP Address]等于Null(因为它们是无与伦比的)。
因此条件:

WHERE Table2.[IP Address] Is Null

将准确地做您需要的事情:

仅从没有匹配的表中获取这些行 在

最新更新