sql >> Databasteknik >  >> RDS >> PostgreSQL

Välj användare som endast tillhör vissa avdelningar

Det här är en relationell division utan resterande (RDNR) problem. Se denna artikel av Dwain Camps som ger många lösningar på denna typ av problem.

Första lösningen

SQL Fiddle

SELECT empId
FROM (
    SELECT
        empID, cc = COUNT(DISTINCT department)
    FROM employe
    WHERE department IN('Y', 'Z')
    GROUP BY empID
)t
WHERE
    t.cc = 2
    AND t.cc = (
        SELECT COUNT(*)
        FROM employe
        WHERE empID = t.empID
    )

Andra lösning

SQL Fiddle

SELECT e.empId
FROM employe e
WHERE e.department IN('Y', 'Z')
GROUP BY e.empID
HAVING
    COUNT(e.department) = 2
    AND COUNT(e.department) = (SELECT COUNT(*) FROM employe WHERE empID = e.empId)

Utan att använda GROUP BY och HAVING :

SELECT DISTINCT e.empID
FROM employe e
WHERE
    EXISTS(
        SELECT 1 FROM employe WHERE department = 'Z' AND empID = e.empID
    )
    AND EXISTS(     
        SELECT 1 FROM employe WHERE department = 'Y' AND empID = e.empID
    )
    AND NOT EXISTS(
        SELECT 1 FROM employe WHERE department NOT IN('Y', 'Z') AND empID = e.empID
    )


  1. Group_concat MySQL-funktionens motsvarighet i Oracle

  2. Jämföra objekt efter värde. Del 6:Struktur Jämställdhetsimplementering

  3. MySQL-sökfråga på två olika fält

  4. pg_config visar 9.4 istället för 9.3