[英]Sql server not parsing Sub-query
我在SQL Server 2012中有以下查询,当运行整个查询时,该查询运行良好,但是内部查询没有单独运行,因为AdviceRecordID不属于tblB。
SELECT DISTINCT SubLOBID
FROM tblA
WHERE AdviceRecordID
IN (SELECT AdviceRecordID
FROM tblB
)
第一种情况是整个查询都在运行,根本没有考虑WHERE条件,而是重试了所有结果而没有任何错误,这对我来说很奇怪。
这按SQL标准的预期和要求运行。 如果子查询引用的子列在子查询的表中不可用,但在外部查询中是有效列,则使用外部查询的列中的值。
所以查询:
SELECT DISTINCT SubLOBID
FROM tblA
WHERE AdviceRecordID IN (SELECT AdviceRecordID
FROM tblB);
实际上是一个与co相关的子查询,并且被解析并执行为:
SELECT DISTINCT SubLOBID
FROM tblA
WHERE AdviceRecordID IN (SELECT tblA.AdviceRecordID
FROM tblB);
所以对于每一行tblA
子查询返回的值tblA.AdviceRecordID
在每一行一次tblB
,并比较了该规则的IN
操作符。
这就是查询整体上有效的原因,并且其行为就像没有使用where子句一样,因为上述等效于:
SELECT DISTINCT SubLOBID
FROM tblA
WHERE AdviceRecordID IS NOT NULL;
并且,如果AdviceRecordID列中没有NULL值,则WHERE
子句不会过滤掉任何内容。
最好使用EXISTS
代替IN
子句。
检查差异:
SELECT DISTINCT A.SubLOBID
FROM tblA A
WHERE EXISTS
(
SELECT B.AdviceRecordID
FROM tblB B
WHERE B.AdviceRecordID=A.AdviceRecordID
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.