我有4個表EMPLOYEE
,COMPANY
,WORKS
和MANAGES
。這些表的定義如下 -如何簡化where子句中的嵌套select?
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
);
我需要找到所有與他們工作的公司居住在同一個城市的員工。 到目前爲止,我已經做到了這一點。
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)));
它工作正常。但我想知道有沒有更簡單的方法來做這個查詢?
瞭解一個INNER JOIN是什麼,你會將它簡化爲大約一行SQL。你也應該重新考慮你的專欄。如果您有兩個名爲'John Smith'的員工或在同一城市有兩個辦事處的公司,會發生什麼情況? –
@KenWhite感謝您的建議。我想我應該改變主鍵。 –
我認爲你應該向ID號和公司添加ID列,然後你的WORKS表將是EMPLOYEE_ID,COMPANY_ID,你的MANAGES表將成爲EMPLOYEE_ID,MANAGER_ID,其中manager_id是EMPLOYEE_ID(一個工人不能由非 - 員工,對吧?)。 –