【发布时间】:2017-03-09 19:22:03
【问题描述】:
我有 4 张桌子 EMPLOYEE、COMPANY、WORKS 和 MANAGES。这些表定义如下-
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 感谢您的建议。我想我应该改变主键。
-
我认为你应该在 EMPLOYEE 和 COMPANY 中添加 ID 列,然后你的 WORKS 表将是 EMPLOYEE_ID、COMPANY_ID,而你的 MANAGES 表将变为 EMPLOYEE_ID、MANAGER_ID,其中 manager_id 是 EMPLOYEE_ID(工人可以'不是由非员工管理的,对吗?)。
-
@KenWhite 是的,你是对的。每个经理都是员工。
标签: sql database oracle oracle11g