【发布时间】:2014-09-05 04:02:58
【问题描述】:
我只是在玩连接,发现了这个奇怪的问题:
我尝试过这样的事情:
SELECT *
FROM ((EMPLOYEES INNER JOIN DEPARTMENTS USING(DEPARTMENT_ID))
NATURAL JOIN LOCATIONS);
结果是 106 行。然后,我只想选择那些 CITY 属性等于 'Toronto' 的行,所以我这样做了:
SELECT *
FROM ((EMPLOYEES INNER JOIN DEPARTMENTS USING(DEPARTMENT_ID))
NATURAL JOIN LOCATIONS)
WHERE CITY = 'Toronto';
结果正好包含我需要的 CITY 等于 'Toronto' 的 2 行。但是,我不需要所有列,所以我将查询更改为
SELECT LAST_NAME, JOB_ID, DEPARTMENT_ID, DEPARTMENT_NAME, CITY
FROM ((EMPLOYEES INNER JOIN DEPARTMENTS USING(DEPARTMENT_ID))
NATURAL JOIN LOCATIONS)
WHERE CITY = 'Toronto';
这给了我 106 行,并且 CITY 始终设置为“多伦多”,这对我来说没有任何意义。另一个奇怪的事情是,当我也选择属性 LOCATION_ID 时,结果是正确的(我想要 2 行)。
以下是相关的关系模式:
describe EMPLOYEES
Name Null Type
-------------- -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
JOB_ID NOT NULL VARCHAR2(10)
DEPARTMENT_ID NUMBER(4)
describe DEPARTMENTS
Name Null Type
--------------- -------- ------------
DEPARTMENT_ID NOT NULL NUMBER(4)
DEPARTMENT_NAME NOT NULL VARCHAR2(30)
MANAGER_ID NUMBER(6)
LOCATION_ID NUMBER(4)
describe locations
Name Null Type
-------------- -------- ------------
LOCATION_ID NOT NULL NUMBER(4)
CITY NOT NULL VARCHAR2(30)
我知道我可以用 50 种不同且更简单的方式编写此查询,但我想知道这出了什么问题。我使用 Oracle SQL Developer。
谢谢
【问题讨论】: