SELECT子句使用not exists条件

时间:2014-05-15 16:11:09

标签: sql oracle

五张桌子:

//Applicant
A#
-----------------
1
2
3
4
5

//coursepass
A#         ctitle
-------------------
1          hello
2          testing
3          yeah
4          coding
5          computer

//position
p#
----------------
0001
0002
0003
0004
0005
0006

//applies
A#         p#
-------------
1          0001
2          0001
3          0002
4          0003
5          0004
6          0005

//Sneeded
p#         sname
-----------------
0001        Java
0002         C++
0003         C#
0004         C
0005         C

我的问题是找到申请人coursepassed的头衔,申请人没有申请任何需要技能名称的职位='C'

所以对于我上面的表格。我们可以看到p#0004,0005需要'C',所以A#= 1,2,3,4应用一个位置但是位置不需要'C'所以请参考coursepass,ctitle hello,testing ,是的,编码将显示

//RESULT
CTITLE
-------------
hello
testing
yeah
coding

我使用此查询,但无法获得我想要的结果

SELECT cp.CTITLE
  FROM COURSEPASSED cp
 WHERE NOT EXISTS (SELECT a.A#
                     FROM APPLIES a
                     JOIN SNEEDED sn ON a.P#=sn.P# and sn.SNAME='C');

以下查询返回我期望的结果。

SELECT cp.CTITLE 
  FROM COURSEPASSED cp
 WHERE cp.A# NOT IN (SELECT a.A#
                       FROM APPLIES a
                       JOIN SNEEDED sn ON a.P#=sn.P# and sn.SNAME='C');

但我想使用NOT EXISTS条件。我该如何更改查询?

1 个答案:

答案 0 :(得分:2)

您的NOT EXISTS子句应引用外部表中的某些值。

SELECT cp.CTITLE FROM COURSEPASS cp
WHERE NOT EXISTS
(
    SELECT a.A# FROM APPLIES a JOIN SNEEDED sn 
    ON a.P#=sn.P# and sn.SNAME='C'
    WHERE a.A# = cp.A#    // notice reference back to cp
);