Sql SELECT子句使用exists和多个表
表格:Sneed、应用、coursepassSql SELECT子句使用exists和多个表,sql,oracle,Sql,Oracle,表格:Sneed、应用、coursepass //Sneed P# SNAME ------------------ 0001 C 0002 C++ 0003 JAVA 0004 C //Applies A# P# ---------------- 000001 0001 000002 0002 000003 0001 //coursepass A#
//Sneed
P# SNAME
------------------
0001 C
0002 C++
0003 JAVA
0004 C
//Applies
A# P#
----------------
000001 0001
000002 0002
000003 0001
//coursepass
A# TITLE
---------------------
000001 C PROGRAM
000002 JAVA
000003 PRINTING
我的问题是找到申请该职位的申请人的课程课程名称,他们需要一个技能(Sneed)名称“C”
我使用了以下查询
SELECT cp.CTITLE FROM COURSEPASSED cp WHERE
EXISTS
(SELECT P# FROM APPLIES ap WHERE cp.A#=ap.A# AND
EXISTS
(SELECT P# FROM SNEEDED sn WHERE sname='C programming'));
但是得到一个空的结果。
我的输出应该是这样的
TITLE
---------
C PROGRAM // <--- As P#=0001 required 'C'
标题
---------
C PROGRAM/您的条款之一是:
EXISTS (SELECT P# FROM SNEEDED sn WHERE sname='C programming');
这将返回FALSE
,因为sname
从不接受'C programming'
的值。因此,整个子句返回FALSE
对于示例数据,您将使用:
EXISTS (SELECT P# FROM SNEEDED sn WHERE sname = 'C');
也许你的意思是:
EXISTS (SELECT P# FROM SNEEDED sn WHERE sname = 'C' or sname like 'C %');
编辑:
您的查询逻辑看起来不正确。您的整个查询可能应该有显式联接来组合这些易于组合的表:
SELECT cp.CTITLE
FROM COURSEPASSED cp JOIN
APPLIES a
ON cp.A# = a.A# JOIN
SNEEDED s
ON s.P# = a.P#
WHERE sname = 'C';
但我似乎只能使用嵌套查询。这意味着需要多个select,并且只能使用exists/not exists子句。这就是为什么我认为这是有逻辑的…@MatBailie。编辑没有做出这样的假设。尽管在应用程序中可能存在完全相同的副本,但这不太可能。但是应用
与其他每个表都有一对多的关系。这不重要的原因(就副本而言)是因为where
子句。@user3553846。使用显式联接编写查询是一种“正确”的方法,特别是对于这样相关的三个表(一种非常常见的情况)。您可以使用exists
,但在子查询中仍然需要join
s,除非您真正讨厌查询。