SQL Сервер дублирует результаты три раза - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь отфильтровать свои результаты, чтобы вывести имена людей, которые работают во всех проектах, контролируемых отделом 5. Я думал, что то, что я написал ниже, даст мне желаемый результат, но вместо этого он отображает имена людей, которые работать над этим проектом три раза каждый. Что бы я сделал, чтобы исправить это?

SELECT e.Fname, e.Minit, e.Lname
FROM EMPLOYEE AS e, DEPARTMENT as d, PROJECT as p
WHERE p.Dnum=d.Dnumber AND d.Dnumber=e.Dno AND p.Dnum=5

Что приводит к выводу:

John    B   Smith
John    B   Smith
John    B   Smith
Franklin    T   Wong
Franklin    T   Wong
Franklin    T   Wong
Joyce   A   English
Joyce   A   English
Joyce   A   English
Ramesh  K   Narayan
Ramesh  K   Narayan
Ramesh  K   Narayan

1 Ответ

0 голосов
/ 16 марта 2020

Похоже, что у вас есть отношения многие-к-одному, и вы не учитываете это при выполнении ваших соединений ANSI-89 (для 1989 года). В результате вы получаете несколько строк на сотрудника, поскольку в таблицах DEPARTMENT и PROJECT.

объединены несколько строк. Учитывая, что в SELECT I вы ссылаетесь только на EMPLOYEE. предположим, вы действительно хотите EXISTS:

SELECT e.Fname,
       e.Minit,
       e.Lname
FROM dbo.EMPLOYEE E
WHERE E.Dno = 5 --Inferred as p.Dnum=5 and p.Dnum=d.Dnumber and d.Dnumber=e.Dno. Thus e.Dno = 5
  AND EXISTS (SELECT 1
              FROM dbo.DEPARTMENT D
                   JOIN dbo.PROJECT P ON D.Dnumber = P.Dnum
              WHERE D.Dnumber = E.Dno);

Если, однако, вам все равно, есть ли у сотрудника отдел (или проект), тогда будет хорошо следующее:

SELECT e.Fname,
       e.Minit,
       e.Lname
FROM dbo.EMPLOYEE E
WHERE E.Dno = 5;
...