我有一个问题:
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
答案 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)
您需要加入emp
和dept
表格,因为您目前每个dept
获得一行,因为该表格没有任何限制。
emp.deptid
表上可能有一个emp
列,或者数据库中的其他一些连接表。