2011-07-26 4 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

Причина в том, что ваш запрос не хватает РЕГИСТРИРУЙТЕСЬ критериев, чтобы связать две таблицы, так что результат будет декартово произведение. Каждый 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

Поскольку вы не указали, как присоединиться к ому и отделу, и поэтому имеют декартово произведение (все возможные комбинации).

Try:

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

Вы должны присоединиться к таблицам, а не выбрать из каждого. БД не знает отношения к emp и dept без объединения.

Try:

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

Вам необходимо присоединиться к вашим таблицам emp и dept, так как вы в настоящее время получаете 1 строку для каждого dept, так как для этой таблицы нет ограничений.

Возможно, есть столбец emp.deptid таблицы emp или какая-либо другая таблица соединений в базе данных.

1

Потому что это результат перекрестного соединения между этими двумя таблицами (emp, dept). Вы отсутствуют условия соединения, т.е.

where dept.deptno = emp.deptno and emp.ename = 'SMITH'; 
Смежные вопросы