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
将准确地做您需要的事情:
仅从没有匹配的左表中获取这些行 在右表
上
。