Запрос на фильтрацию по количеству - PullRequest
2 голосов
/ 12 мая 2011

С учетом этих таблиц:

Employee(ssn, name, sex, address, salary, bdate, dno, superssn)
fk:superssn is ssn in Employee
fk:dno is dnumber in Department

Department(dnumber, dname, mgrssn, mgrstartdate)
fk:mgrssn is ssn in Employee

Dept_locations(dnumber, dlocation)
fk:dnumber is dnumber in Department

Project(pnumber, pname, plocation, dnum)
fk:dnum is dnumber in Department

Dependent(essn, dependent_name, sex, bdate, relationship)
fk: essn is ssn in Employee

Works_on(essn,pno,hours)
fk: essn is ssn in Employee; pno is pnumber in Project

Мне нужно получить название каждого отдела, а также имя менеджера департаментов для отделов, которые имеют два местоположения ...

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

SELECT D.dname, D.mgrssn
FROM department D, dept_locations DL
WHERE D.dnumber = dl.dnumber
Group by D.dname, D.mgrssn

Теперь я получаю три не дублирующих отдела. Как я могу ограничить это отделами, которые имеют два местоположения?

Ответы [ 3 ]

2 голосов
/ 12 мая 2011
SELECT D.dname, D.mgrssn
FROM Department D, Dept_locations DL
WHERE D.dnumber = DL.dnumber
GROUP BY D.dname, D.mgrssn
HAVING COUNT(*) >= 2            --- for 2 or more locations

и лучше использовать INNER JOIN (или просто JOIN) вместо WHERE для объединения связанных таблиц. Обратите внимание на отличие от предыдущего запроса. Оба вернут одинаковые результаты:

SELECT D.dname, D.mgrssn
FROM Department D
    JOIN Dept_locations DL
        ON D.dnumber = DL.dnumber
GROUP BY D.dname, D.mgrssn
HAVING COUNT(*) >= 2          

Если вы также хотите показать имя менеджера, вам также нужно присоединиться к таблице Employee (и соответственно группировать):

SELECT D.dname
     , D.mgrssn
     , E.name
FROM Department D
    JOIN Employee E 
        ON E.ssn = D.mgrssn
    JOIN Dept_locations DL
        ON D.dnumber = DL.dnumber
GROUP BY D.dname
       , D.mgrssn
       , E.name
HAVING COUNT(*) >= 2       
1 голос
/ 12 мая 2011

Точно для двух мест:

SELECT d.name AS dept_name,
       e.name AS mgr_name
  FROM DEPARTMENT d
  JOIN EMPLOYEE e ON e.ssn = d.mgrssn
 WHERE EXISTS (SELECT NULL
                 FROM DEPT_LOCATIONS dl
                WHERE dl.dnumber = d.dnumber
             GROUP BY dl.dnumber
               HAVING COUNT(*) = 2)

Для двух или более мест:

SELECT d.name AS dept_name,
       e.name AS mgr_name
  FROM DEPARTMENT d
  JOIN EMPLOYEE e ON e.ssn = d.mgrssn
 WHERE EXISTS (SELECT NULL
                 FROM DEPT_LOCATIONS dl
                WHERE dl.dnumber = d.dnumber
             GROUP BY dl.dnumber
               HAVING COUNT(*) >= 2)

Помните

Таблица DEPARTMENT имеет mgrstartdate, так что вам нужно проверить это - два приведенных мною примера покажут вам всех исторических менеджеров в дополнение к текущим менеджерам, потому что в mgrstartdate.

нет фильтрации.
0 голосов
/ 12 мая 2011
select dname, name
from Department, Employee, Dept_locations
where mgrssn = ssn
and Department.dnumber = Dept_locations.dnumber
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...