带有JOIN的SQL子查询

Baj*_*lor 4 sql database oracle

我正在努力学习Subquerys.
我有这个麻烦:

两个表:

CREATE TABLE DEPT
(DEPTNO NUMBER(2) CONSTRAINT DEPT_PRIMARY_KEY PRIMARY KEY,
LOC varchar2(3));

CREATE TABLE EMP
(ENAME varchar2(10),
JOB varchar2(9),
DEPTNO NUMBER(2) NOT NULL
CONSTRAINT EMP_FOREIGN_KEY REFERENCES DEPT (DEPTNO));
Run Code Online (Sandbox Code Playgroud)

我想获得名称(emp.ename)和工作(emp.job),但只有"CHICAGO"中的工作也存在.

这就是我所做的:

SELECT emp1.ename, emp1.job
FROM emp emp1
WHERE emp1.job EXISTS (SELECT emp2.job
                      FROM emp emp2
                      FULL JOIN dept ON (emp2.deptno = dept.deptno)
                      WHERE dept.loc = 'CHICAGO');
Run Code Online (Sandbox Code Playgroud)

我总是在第3行得到"无效的关系运算符"错误.

结果示例:

ENAME | JOB  | LOC 
JONES | SALE | CHICAGO 
FORD  | SALE | NEW YORK  //He doesn't sit in CHICAGO but the job also exists in Chicago 
Run Code Online (Sandbox Code Playgroud)

Nis*_*hia 6

要简化查询,您可以使用:

select emp1.ename, emp1.job 
from EMP emp1 
where emp1.deptno in (SELECT DEPT.DEPTNO from DEPT where DEPT.loc = 'CHICAGO');
Run Code Online (Sandbox Code Playgroud)

要从emp1中选择名称和工作,其中emp1的工作与emp2的工作相同,位置芝加哥:

SELECT emp1.ename, emp1.job
FROM emp emp1
WHERE emp1.job IN (SELECT emp2.job
                      FROM emp emp2
                      FULL JOIN dept ON (emp2.deptno = dept.deptno)
                      WHERE dept.loc = 'CHICAGO');
Run Code Online (Sandbox Code Playgroud)

如果在芝加哥有至少一个位置记录,则从emp1中选择名称和作业.

  SELECT emp1.ename, emp1.job
    FROM emp emp1
    WHERE  EXISTS (SELECT emp2.job
                   FROM emp emp2
                   FULL JOIN dept ON (emp2.deptno = dept.deptno)
                   WHERE dept.loc = 'CHICAGO');
Run Code Online (Sandbox Code Playgroud)

在您的情况下,我假设第一个和第二个查询更合适.