Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql SELECT子句使用exists和多个表_Sql_Oracle - Fatal编程技术网

Sql SELECT子句使用exists和多个表

Sql 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、应用、coursepass

//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,除非您真正讨厌查询。