2013-12-04 2 views
0

Я пытаюсь написать запрос SQL для достижения следующего (Фактическая схема в моей проблемы разные, но идея та же)Выбор любого из из соотношения

Скажем, у меня есть две таблицы

Employee стол

------- ---- --- ------- 
empl_id name age dept_id 
------- ---- --- ------- 
1  a 30 1 
2  b 35 1 
3  c 45 2 
4  d 30 2 
5  e 50 3 
6  f 50 3 

Department стол

------- ---- 
dept_id name 
------- ---- 
1  x 
2  y 
3  z 

Что я хочу достичь в два раза

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

Итак, выполнив запрос на приведенных выше таблицах должны возвращать

dept_id emp_id 
------- ------ 
1  1 <-- I don't care if emp_id returned is 1 or 2. Both satisfy the filter 
2  4 

Я знаю, что могу достичь цель a) с этим запросом

select 
    dept_id 
from 
    Department d 
where 
    exists (
     select 
      1 
     from 
      Employee e 
     where 
      e.age < 40 
     and e.dept_id = d.dept_id 
    ) 

Но я не могу придумать способ достижения б). Может кто-то пролил свет?

Благодаря

+0

Кстати, то, что СУРБД вы используете? – neutrino

+0

@neutrino IBM Informix – ubi

ответ

1
SELECT Department.dept_id, empl_id 
FROM Department JOIN Employee ON Employee.dept_id = Department.dept_id 
AND Employee.age < 40 
GROUP BY Department.dept_id 

SQL Fiddle here.

Если вы используете СУБД, которая требует агрегатной функции для использования GROUP BY, как, например, MS SQL Server, вы можете сделать что-то вроде:

select Department.dept_id, MIN(empl_id) 
from Department JOIN Employee ON Employee.dept_id = Department.dept_id 
AND Employee.age < 40 
GROUP BY Department.dept_id 
+0

Отлично! Это дает результат, который я ожидаю. Но я всегда думал, что должна быть сводная функция с оператором group by. Разве это не так? Можете ли вы добавить немного больше объяснений? – ubi

+0

Ну, это было проверено на MySQL. Подробное объяснение можно найти здесь (http://stackoverflow.com/questions/1225144/why-does-mysql-allow-group-by-queries-without-aggregate-functions). Если вы используете другие РСУБД, дайте мне знать. – neutrino

+0

См. Мой обновленный ответ – neutrino

1

Попробуйте это заявление.

select t.dept_id, min(t.empl_id) as empl_id 

from 
(
    select dept_id, empl_id 
    from 
    employee 
    where 
    age < 40 
) t 

group by t.dept_id 
0

попробовать это,

;WITH T(DEPTID,EMPID,CNT_OF_EMP) 
AS 
(
SELECT D.DEPT_ID,E.EMPL_ID,COUNT(E.ID) 
FROM DEPARTMENT D INNER JOIN EMPLOYEE E ON E.DEPT_ID = D.DEPT_ID AND E.age>40 
GROUP BY E.EMPL_ID,D.DEPT_ID 
) 
SELECT EMPID FROM T 
0

Это еще проще, и я думаю, что это даже быстрее, чем мой предыдущий ответ, и exist подход:

select dept_id, MIN(empl_id) 
from Employee 
WHERE Employee.age < 40 
GROUP BY dept_id 
Смежные вопросы