2011-07-26 56 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'; 
相关问题