SQL 外部查询 NOT IN 内部查询引用外部查询

噬菌体

我有一些 T-SQL 难题似乎正在起作用,但我想知道是否有人可以尝试向我详细说明这里发生的事情。考虑以下脚本:

SELECT *
FROM TableA a
WHERE a.CustomerID NOT IN (SELECT b.CustomerID FROM TableB b WHERE a.CustomerID = b.CustomerID AND a.WorkOrder = b.WorkOrder)
AND a.[Date] > DATEADD(DD,-3,GETDATE())

我很困惑编译器如何不会在这个脚本上内爆。它如何在引用外部查询的子查询上选择 where NOT IN?获取 TableA 的内容,其中 CustomerID NOT IN CustomerID 来自 TableB 等...但是当它在子查询中找到匹配的 CustomerID 时,NOT IN 会启动并阻止记录显示在外部查询选择中。我猜这是编译器停止的地方。但是因为没有选择那个特定的CustomerID,它不能加入内部查询,因此内部查询不选择那个CustomerID,然后允许外部查询选择该记录?是的?不?掉进兔子洞?有没有更好的方法来写这个?

如果有人可以详细说明这里发生的事情,或参考可以解释的内容,我们将不胜感激。我真的找不到任何人解释这个过程,也许没有使用正确的搜索词。

谢谢!

保罗麦克斯韦

它被称为“相关子查询”和“子查询可以为外部查询处理的每一行评估一次”。

所以在这里,对于 TableA 的每一行,子查询从 TableB 中寻找匹配的数据,并确定是否满足 NOT IN 条件。然后到 TableA 中的下一行重复该循环,直到 TableA 的所有相关行都被评估。

当您连接 2 个表但忽略存在连接的行时,另一种方法可能是“左排除连接”。

SELECT
      *
FROM TableA a
LEFT JOIN TableB b ON a.CustomerID = b.CustomerID
                  AND a.WorkOrder = b.WorkOrder
WHERE b.CustomerID IS NULL
AND a.[Date] > DATEADD(DD, -3, GETDATE())
;

或使用 NOT EXISTS 的另一种“半连接”替代方案:

SELECT
      *
FROM TableA a
WHERE NOT EXISTS (
      SELECT NULL
      FROM TableB b
      WHERE a.CustomerID = b.CustomerID
      AND a.WorkOrder = b.WorkOrder
      )
AND a.[Date] > DATEADD(DD, -3, GETDATE())
;

注意用于 |NOT| 的子查询 EXISTS 不必通过 select 子句返回任何值。有些人在使用 EXISTS 时更喜欢使用“select 1”或“select *”,但实际上使用哪个并不重要。使用“select NULL”是我的偏好。

您可以通过检查执行计划来了解有关这些替代方案的更多信息,例如,请参见http://sqlfiddle.com/#!6/04064/2

原始查询:在此处输入图片说明“左排除连接”替代方案:在此处输入图片说明“不存在”替代方案:在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

考虑内部/外部子查询的过滤/分页的Postgres SQL性能

来自分类Dev

SQL子查询混乱:如何引用SAME表中的外部查询列

来自分类Dev

SQL子查询-引用子查询的“ WHERE”子句中的外部值

来自分类Dev

减少SQL查询中的左外部联接

来自分类Dev

SQL子查询如何使用外部变量

来自分类Dev

与SQL Server的外部连接中的查询参数

来自分类Dev

如何外部化插入文件SQL查询

来自分类Dev

利用完全外部联接与Sql查询

来自分类Dev

SQL外部查询值插入嵌套子查询联接

来自分类Dev

PostgreSQL在子查询中引用外部查询

来自分类Dev

PostgreSQL在子查询中引用外部查询

来自分类Dev

从内部查询更新外部计数

来自分类Dev

SQL Server:查询字符串内部的变量不能在外部访问

来自分类Dev

如何在内部查询中引用外部查询的成员?

来自分类Dev

左外部Join查询返回SQL Server中的重复项

来自分类Dev

从工作表和外部文件的VBA SQL查询数据

来自分类Dev

来自WordPress中外部数据库的SQL查询

来自分类Dev

左外部联接查询非常慢-SQL Server

来自分类Dev

从Java中的外部文本文件接受SQL查询

来自分类Dev

SQL Postgres使用avg列作为外部查询中的变量

来自分类Dev

在SQL Server中的外部应用使我的查询工作缓慢

来自分类Dev

子查询引用外部列的问题

来自分类Dev

Oracle将外部查询值传递给内部查询

来自分类Dev

如何在MySQL的内部查询中从外部查询访问值

来自分类Dev

无法将SQL查询转换为LINQ查询以进行左外部联接

来自分类Dev

SQL将子查询“总计记录”返回到外部查询

来自分类Dev

SQL SERVER:子查询中的WHERE子句从外部查询获取属性

来自分类Dev

如何使用 Spark SQL 从外部查询中的子查询访问列

来自分类Dev

外部查询ColdFusion

Related 相关文章

  1. 1

    考虑内部/外部子查询的过滤/分页的Postgres SQL性能

  2. 2

    SQL子查询混乱:如何引用SAME表中的外部查询列

  3. 3

    SQL子查询-引用子查询的“ WHERE”子句中的外部值

  4. 4

    减少SQL查询中的左外部联接

  5. 5

    SQL子查询如何使用外部变量

  6. 6

    与SQL Server的外部连接中的查询参数

  7. 7

    如何外部化插入文件SQL查询

  8. 8

    利用完全外部联接与Sql查询

  9. 9

    SQL外部查询值插入嵌套子查询联接

  10. 10

    PostgreSQL在子查询中引用外部查询

  11. 11

    PostgreSQL在子查询中引用外部查询

  12. 12

    从内部查询更新外部计数

  13. 13

    SQL Server:查询字符串内部的变量不能在外部访问

  14. 14

    如何在内部查询中引用外部查询的成员?

  15. 15

    左外部Join查询返回SQL Server中的重复项

  16. 16

    从工作表和外部文件的VBA SQL查询数据

  17. 17

    来自WordPress中外部数据库的SQL查询

  18. 18

    左外部联接查询非常慢-SQL Server

  19. 19

    从Java中的外部文本文件接受SQL查询

  20. 20

    SQL Postgres使用avg列作为外部查询中的变量

  21. 21

    在SQL Server中的外部应用使我的查询工作缓慢

  22. 22

    子查询引用外部列的问题

  23. 23

    Oracle将外部查询值传递给内部查询

  24. 24

    如何在MySQL的内部查询中从外部查询访问值

  25. 25

    无法将SQL查询转换为LINQ查询以进行左外部联接

  26. 26

    SQL将子查询“总计记录”返回到外部查询

  27. 27

    SQL SERVER:子查询中的WHERE子句从外部查询获取属性

  28. 28

    如何使用 Spark SQL 从外部查询中的子查询访问列

  29. 29

    外部查询ColdFusion

热门标签

归档