这两个查询有什么区别?
Whats the difference between these two queries?
SELECT DISTINCT S.sname
FROM student S,
enrolled E1,
enrolled E2,
class C1,
class C2
WHERE S.snum = E1.snum
AND S.snum = E2.snum
AND E1.cname <> E2.cname
AND E1.cname = C1.NAME
AND E2.cname = C2.NAME
AND C1.meets_at = C2.meets_at;
和
SELECT DISTINCT S.sname
FROM student S
WHERE S.snum IN (SELECT E1.snum
FROM enrolled E1,
enrolled E2,
class C1,
class C2
WHERE E1.snum = E2.snum
AND E1.cname <> E2.cname
AND C1.meets_at = C2.meets_at);
两个查询都在执行并显示输出
第一个查询显示输出为空集,而第二个查询显示一些非空输出
我认为这两个查询都会给我相同且正确的输出,但只有第二个查询显示正确的结果。
谁能解释一下这两个查询之间的区别是什么?
提前致谢。
在第二个查询中 "Es" 和 "Cs" 之间没有指定连接关系,因此这将是一个交叉连接(一切都匹配)。您在第一个查询中有这个,而在第二个查询中没有可比性:
AND E1.cname = C1.NAME
AND E2.cname = C2.NAME
SELECT DISTINCT S.sname
FROM student S,
enrolled E1,
enrolled E2,
class C1,
class C2
WHERE S.snum = E1.snum
AND S.snum = E2.snum
AND E1.cname <> E2.cname
AND E1.cname = C1.NAME
AND E2.cname = C2.NAME
AND C1.meets_at = C2.meets_at;
和
SELECT DISTINCT S.sname
FROM student S
WHERE S.snum IN (SELECT E1.snum
FROM enrolled E1,
enrolled E2,
class C1,
class C2
WHERE E1.snum = E2.snum
AND E1.cname <> E2.cname
AND C1.meets_at = C2.meets_at);
两个查询都在执行并显示输出 第一个查询显示输出为空集,而第二个查询显示一些非空输出
我认为这两个查询都会给我相同且正确的输出,但只有第二个查询显示正确的结果。 谁能解释一下这两个查询之间的区别是什么? 提前致谢。
在第二个查询中 "Es" 和 "Cs" 之间没有指定连接关系,因此这将是一个交叉连接(一切都匹配)。您在第一个查询中有这个,而在第二个查询中没有可比性:
AND E1.cname = C1.NAME
AND E2.cname = C2.NAME