从一个表中选择排除另一个表的记录
问题:
给定两个表,table1 包含列 id 和 name,table2 包含列 id 和 name,检索 table2 中所有 name 值不在 table1 中的行。
建议查询(不正确):
<code class="language-sql">SELECT name FROM table2 -- that are not in table1 already</code>
解决方案:
获得所需结果的更准确的查询是:
<code class="language-sql">SELECT t2.name FROM table2 t2 LEFT JOIN table1 t1 ON t1.name = t2.name WHERE t1.name IS NULL;</code>
解释:
此查询使用左连接将 table2 中的每一行与 table1 中基于 name 列的对应行匹配。如果在 table1 中找不到匹配的行,则结果中该行的 t1.name 值将为 NULL。通过仅选择 t1.name 为 NULL 的那些行,我们有效地排除了 table2 中在 table1 中具有匹配 name 值的记录。 或者,可以使用NOT EXISTS
子句来实现相同的结果:
<code class="language-sql">SELECT name FROM table2 t2 WHERE NOT EXISTS ( SELECT 1 FROM table1 t1 WHERE t1.name = t2.name );</code>
这个NOT EXISTS
版本通常比LEFT JOIN
版本效率更高,尤其是在大型数据集上。
以上是如何从Table2中选择记录,排除Table1中名称匹配的记录?的详细内容。更多信息请关注PHP中文网其他相关文章!