Oracle/DM:LEFT OUTER JOIN扫除数据(代替:not in)

打印 上一主题 下一主题

主题 833|帖子 833|积分 2499

为了使用 LEFT OUTER JOIN 来扫除 表1 中那些 id 在 表2 中有匹配的纪录,我们可以按照以下步骤进行操纵:
数据表:
表1(table1):
idname112234表2(table2):
id12目标:
我们盼望扫除 table1 中那些在 table2 中有匹配的 id,即扫除 id = 1 和 id = 2 的纪录,最终返回的是 id = 3 的纪录。
SQL 查询:
SELECT t1.id, t1.name
FROM table1 t1
LEFT OUTER JOIN table2 t2 ON t1.id = t2.id
WHERE t2.id IS NULL;
解释:
1.LEFT OUTER JOIN:我们将 table1 和 table2 根据 id 进行左外连接。左外连接会返回 table1 中的所有纪录,并实行将 table2 中与之匹配的纪录关联上。如果 table2 中没有对应的 id,则该列的值为 NULL。
2.WHERE t2.id IS NULL:我们在 WHERE 子句中添加了一个条件,确保只返回 table1 中那些没有在 table2 中找到匹配纪录的行。也就是说,table1 中的 id 必须没有出现在 table2 中。
结果:
idname34解释:
3.id = 1 和 id = 2 在 table2 中找到了匹配的纪录,因此它们被扫除在结果之外。
4.只有 id = 3 的纪录没有在 table2 中找到匹配,因此它被保留在结果中。
总结:
通过 LEFT OUTER JOIN 和 WHERE t2.id IS NULL 的组合,我们可以扫除 table1 中那些在 table2 中有匹配的纪录,最终得到不在 table2 中出现的 table1 的纪录。
和not in区别

实际上,使用 LEFT OUTER JOIN 和 WHERE t2.id IS NULL 这种查询方式,结果上等同于使用 NOT IN 来扫除 table2 中存在的 id。它们都能够扫除 table1 中那些在 table2 中有匹配纪录的行。
通过 NOT IN 来扫除纪录
使用 NOT IN 进行同样的查询,可以改写为:
SELECT id, name
FROM table1
WHERE id NOT IN (SELECT id FROM table2);
解释:
1.NOT IN 子查询:首先从 table2 中获取所有的 id 值,然后在 table1 中扫除那些 id 出现在 table2 中的纪录。
2.只有 table1 中那些不在 table2 中的 id 才会被返回。
结果:
idname34为什么 LEFT OUTER JOIN 和 NOT IN 在这个场景下是等价的?
3.LEFT OUTER JOIN 和 WHERE t2.id IS NULL:

  • LEFT OUTER JOIN 返回 table1 中的所有纪录,同时实行与 table2 中的 id 进行匹配。
  • 对于没有匹配的行(即 table2.id 为 NULL),我们通过 WHERE t2.id IS NULL 来过滤,只保留那些在 table2 中找不到匹配的纪录。
6.NOT IN:

  • NOT IN 直接扫除 table2 中的所有 id,返回 table1 中那些 id 不在 table2 中的纪录。
区别:
固然它们在这个特定场景下是等价的,但 LEFT OUTER JOIN 和 NOT IN 在性能和处置处罚空值(NULL)方面可能会有所差别。以下是一些关键的区别:
8.性能差异:
9.在某些情况下,NOT IN 可能会导致性能问题,尤其是当子查询返回 NULL 值时,NOT IN 可能会产生意外的结果。在使用 NOT IN 时,如果 table2 中存在 NULL 值,查询结果可能会不符合预期。
10.LEFT OUTER JOIN + WHERE t2.id IS NULL 通常可以更好地处置处罚这种情况,并且对大型数据集的表现可能更稳固。
11.空值处置处罚:

  • 如果 table2.id 中包含 NULL 值,NOT IN 会导致整个查询返回空结果,因为 NOT IN 在处置处罚 NULL 时表现得比较特别。
  • LEFT OUTER JOIN 和 WHERE t2.id IS NULL 在遇到空值时更具容错性。
总结:

  • 在您的例子中,LEFT OUTER JOIN 和 NOT IN 可以实现雷同的功能:扫除 table1 中那些在 table2 中有匹配 id 的纪录。
  • 然而,在实际应用中,选择哪种方式可能会受到性能、可读性、空值处置处罚等因素的影响。如果数据集非常大或有 NULL 值,LEFT OUTER JOIN 可能是一个更可靠的选择。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表