2011-07-26 104 views
0

我有一個查詢:這個查詢爲什麼顯示所有記錄?

SELECT emp.empno , emp.ename , emp.job , emp.sal , dept.dname , dept.loc 
    FROM emp , 
     dept 
WHERE emp.ename = 'SMITH'; 

請告訴我這是爲什麼顯示所有的記錄,因爲我希望只有一個記錄?

 EMPNO ENAME  JOB    SAL DNAME   LOC 
---------- ---------- --------- ---------- -------------- ------------- 
     7369 SMITH  CLERK   800 ACCOUNTING  NEW YORK 
     7369 SMITH  CLERK   800 RESEARCH  DALLAS 
     7369 SMITH  CLERK   800 SALES   CHICAGO 
     7369 SMITH  CLERK   800 OPERATIONS  BOSTON 
     7369 SMITH  CLERK   800 CREDIT 

回答

8

原因是因爲您的查詢缺少JOIN條件來鏈接兩個表,所以結果將是笛卡爾積。每EMP記錄都會有每一行的一個副本DEPT表...

查詢使用ANSI-89連接語法,這就要求標準是WHERE子句中:

SELECT e.empno, e.ename, e.job, e.sal, d.dname, d.loc 
    FROM EMP e, 
     DEPT d 
WHERE d.deptno = e.deptno 
    AND e.ename = 'SMITH' 

但最好將使用ANSI-92格式:

SELECT e.empno, e.ename, e.job, e.sal, d.dname, d.loc 
    FROM EMP e 
    JOIN DEPT d ON d.deptno = e.deptno 
WHERE e.ename = 'SMITH' 
+0

使用[ANSI語法](http://www.oratechinfo.co.uk/ansi_joins.html)使您可以更輕鬆地記住您的'JOIN'子句。 – RedFilter

3

因爲你還沒有指定如何加入emp和部門,所以有一個笛卡爾乘積(所有可能的組合)。

嘗試:

select emp.empno , emp.ename , emp.job , emp.sal , dept.dname , dept.loc 
from emp 
join dept on dept.deptno = emp.deptno 
where emp.ename = 'SMITH'; 
4

你需要加入的表,而不是從每個選擇。 DB不知道沒有連接的情況下與emp和dept的關係。

嘗試:

select emp.empno , emp.ename , emp.job , emp.sal , dept.dname , dept.loc from emp inner 
join dept on emp.deptno = dept.deptno where 
emp.ename = 'SMITH'; 
2

這是因爲你的FROM emp , dept條款。我期望'SMITH'只屬於一個部門,你真的需要做一個JOIN。

0

您需要加入您的empdept表,因爲您目前對每個dept獲得1行,因爲沒有限制應用於該表。

emp表中可能有emp.deptid列,或者數據庫中有其他連接表。

1

因爲這是這兩個表(emp,dept)之間交叉連接的結果。您缺少連接條件,即

where dept.deptno = emp.deptno and emp.ename = 'SMITH'; 
相關問題