我试图理解,相关的子查询是如何工作的。我正在执行下面的查询,它给出了我想要的输出,但我很难想象它是如何工作的
select top 5* from persons where personid in (select personid from tbpersons where Persons.ConsolidatedStatusID >50)
根据我的理解,第一个内部查询完全执行(虚拟表1),必须执行外部查询以获取具有合并状态> 50(虚拟表2)的行,并且两者都将被比较,留下VT1 with personids和outerquery将被执行。
这个解释实际上并不符合我的想法,我正在看tbpersons的表扫描,根据我的理解,我可以使用,但我也应该看到人员的表扫描,我没有看到。
我能够把它写成一个连接,仍然无法弄清楚,相关的子查询是如何工作的
select top 10 * from
persons rg
join
tbpersons sy
on sy.personid =rg.personid
where rg.ConsolidatedStatusID>50
请你帮我看看如何使用虚拟表逐步执行执行..
答案 0 :(得分:2)
第一个查询中的所有子查询中的第一个不是相关的子查询。这是因为它不引用外部查询。它将在外部查询之前执行,并且只执行一次。然后子查询返回的结果将传递给外部查询的IN运算符 对外部查询返回的每条记录执行相关的子查询,语法类似于..
SELECT Col1, Col2 , ....
FROM Table_Name T1
WHERE Col3 > ( SELECT Col1
FROM Table_Name2
WHERE Col2 = T1.Col2) --<--- Reference to the outer query
现在为什么您的查询导致表扫描,这取决于您的查询可用的索引以及查询中使用的运算符。通过查看您提供的有关查询的信息,很难回答为什么要进行表扫描的问题,如果您有一个覆盖查询。