如何简化where子句中的嵌套选择?

MD.*_*sar 3 sql database oracle oracle11g

我有 4 个表EMPLOYEECOMPANYWORKSMANAGES。这些表定义如下-

CREATE TABLE EMPLOYEE
(
    EMPLOYEE_NAME VARCHAR2(50) NOT NULL PRIMARY KEY,
    STREET VARCHAR2(50) NOT NULL,
    CITY VARCHAR2(30) NOT NULL
);

CREATE TABLE COMPANY
(
    COMPANY_NAME VARCHAR2(100) NOT NULL PRIMARY KEY,
    CITY VARCHAR2(50) NOT NULL
);

CREATE TABLE WORKS
(
    EMPLOYEE_NAME VARCHAR2(50) NOT NULL PRIMARY KEY REFERENCES EMPLOYEE(EMPLOYEE_NAME),
    COMPANY_NAME VARCHAR2(100) NOT NULL REFERENCES COMPANY(COMPANY_NAME),
    SALARY NUMBER(12,2) NOT NULL
);

CREATE TABLE MANAGES
(
    EMPLOYEE_NAME VARCHAR2(50) NOT NULL PRIMARY KEY REFERENCES EMPLOYEE(EMPLOYEE_NAME),
    MANAGER_NAME VARCHAR2(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我需要找到与他们工作的公司住在同一个城市的所有员工。到目前为止,我已经这样做了。

SELECT EMPLOYEE_NAME AS Names
FROM EMPLOYEE
WHERE CITY = (
    SELECT CITY
    FROM COMPANY
    WHERE COMPANY_NAME = (
        SELECT COMPANY_NAME
        FROM WORKS
        WHERE WORKS.EMPLOYEE_NAME = EMPLOYEE.EMPLOYEE_NAME
    )
);
Run Code Online (Sandbox Code Playgroud)

它工作正常。但我想知道有没有更简单的方法来做这个查询?

sca*_*dge 5

您可以使用显式内部连接而不是嵌套子选择

SELECT EMPLOYEE.EMPLOYEE_NAME AS Names
FROM EMPLOYEE
INNER JOIN WORKS ON  WORKS.EMPLOYEE_NAME = EMPLOYEE.EMPLOYEE_NAME
INNER JOIN COMPANY ON  EMPLOYEE.CITY = COMPANY.CITY
Run Code Online (Sandbox Code Playgroud)