Почему этот запрос отображает все записи? - PullRequest
0 голосов
/ 26 июля 2011

У меня есть запрос:

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 ]

8 голосов
/ 26 июля 2011

Причина в том, что в вашем запросе отсутствуют критерии 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'
4 голосов
/ 26 июля 2011

Вам нужно присоединиться к столам, а не выбирать из каждого. БД не знает отношения к 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';
3 голосов
/ 26 июля 2011

Поскольку вы не указали, как объединить 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';
2 голосов
/ 26 июля 2011

Это из-за вашего FROM emp , dept предложения.Я ожидаю, что SMITH принадлежит только одному отделу, и вам действительно нужно вместо этого присоединиться

1 голос
/ 26 июля 2011

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

where dept.deptno = emp.deptno and emp.ename = 'SMITH';
0 голосов
/ 26 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...