我有以下由 MS Access 生成的示例,用于基于 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));
在尝试分析“WHERE (((Table2.[IP Address]) Is Null))”时,我不明白这是怎么回事,因为我将其解释为仅返回 table2@IP 地址为 NULL 的结果。我对 WHERE 子句的理解就像是查询的过滤机制,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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句