Plsql How IN子句在此子查询中工作

Plsql How IN子句在此子查询中工作,plsql,oracle11g,Plsql,Oracle11g,此查询返回分支\u M表中的所有记录 然而,BRANCH\u S表中不存在分支列 表BRANCH\u M有列(ID、BRANCH、SUBBRANCH) 表分支机构有列(SID,部门) 当我运行查询时,输出是 BRANCH_M ID, BRANCH, SUBBRANCH 10 Engg CS 10 Engg ME 20 Mtech EE BRANCH_S SID, DEPT 1 CS 2 IS 请您解释一下这是使用子查询时非常常见的错误。 如果分支机构中没有子

此查询返回
分支\u M
表中的所有记录 然而,
BRANCH\u S
表中不存在分支列

BRANCH\u M
有列
(ID、BRANCH、SUBBRANCH)
分支机构
有列
(SID,部门)

当我运行查询时,输出是

BRANCH_M
ID, BRANCH, SUBBRANCH
10  Engg    CS
10  Engg    ME
20  Mtech   EE

BRANCH_S
SID, DEPT
1    CS
2    IS

请您解释一下这是使用子查询时非常常见的错误。
如果
分支机构
中没有
子分支机构
列,则Oracle会在外部查询中查找该列。
因此,查询变成:

BRANCH
Engg
Engg
Mtech
where
条件的计算结果为true(除了
branch\u s
表为空或
branch\u m.subbranch
包含空值的情况,这是另一种情况)。
要避免此问题,请始终使用别名:

SELECT branch 
FROM branch_m 
WHERE branch_m.subbranch IN (SELECT branch_m.subbranch FROM branch_s)
如果
分支
中没有
子分支
,而不是一个看似正常但错误的查询,那么您将立即得到错误。
你总是用别名,这样你就不会头疼了

SELECT branch 
FROM branch_m 
WHERE branch_m.subbranch IN (SELECT branch_m.subbranch FROM branch_s)
SELECT m.branch 
FROM branch_m m
WHERE m.subbranch IN (SELECT s.subbranch FROM branch_s s)