为什么此查询显示所有记录?

时间:2011-07-26 14:28:46

标签: sql oracle

我有一个问题:

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

6 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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 :(得分:3)

因为你还没有指定如何加入emp和dept,所以有一个笛卡尔积(所有可能的组合)。

尝试:

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';

答案 3 :(得分:2)

这是因为你的FROM emp , dept条款。我希望'SMITH'只属于一个部门而你真的需要做一个JOIN。

答案 4 :(得分:1)

因为这是这两个表(emp,dept)之间交叉连接的结果。您缺少加入条件,即

where dept.deptno = emp.deptno and emp.ename = 'SMITH';

答案 5 :(得分:0)

您需要加入empdept表格,因为您目前每个dept获得一行,因为该表格没有任何限制。

emp.deptid表上可能有一个emp列,或者数据库中的其他一些连接表。