我在数学课程的前一次考试中有这个问题。 这个问题应该在考试的10分钟内得到解答。 我知道规则和材料,但有人可以向我解释如何处理这个问题吗?它看起来如此之深,我不知道如何将它分成几部分而且事情变得如此困惑。
非常感谢。
问题是:这段代码的输出是什么? (答案:(1,2,2)(3,2,2))
create table T(a int, b int);
insert into T values(1,2);
insert into T values(1,3);
insert into T values(2,4);
insert into T values(3,2);
select T1.a, T1.b, count(*)
from T T1, T T2
where T1.b = T2.b and
not exists (select a
from T T3
where b not in(select b
from T T4
where b >= T1.b))
group by T1.a, T1.b;
答案 0 :(得分:1)
“not exists ...”是correlated subquery,并且会对外部选择的结果集中的每一行进行评估:
select T1.a, T1.b, count(*)
from T T1, T T2
where T1.b = T2.b
--------------------
group by T1.a, T1.b;
返回:
因为值2在T.b中出现两次,所以当b = 2时,该列上的连接会生成两行,但对于唯一值3和4,只有一行。因此计数结果。
针对子查询评估上述结果的每一行。最里面的选择:
select b
from T T4
where b >= T1.b
返回T.b的列表,其中b> =上述结果集的b。如果T1.b = 2,则返回的列表为(2,2,3,4),而T1.b = 3则返回(3,4),T1.b = 4返回(4)。
现在,如果是“中间”查询:
select a
from T T3
where b not in (...)
不会在外部查询的结果中返回该特定行的值,该行将显示在最终结果集中。
因为最内层查询仅在T1.b = 2时返回所有b值,所以中间查询仅在T1.b = 2时返回null。仅(1,2,2)和(3,2,2)具有T1 .b = 2并且他们被选中,phew。
答案 1 :(得分:-1)
从内到外开始。 在执行(在您的脑海中)其父查询之前,具有内部查询的结果集。 在你的问题中尝试理解和解决
select b
from T T4
where b >= T1.b
现在转到它的父母......你明白了吗?????好。