sql >> Databáze >  >> RDS >> PostgreSQL

Vyberte uživatele, kteří patří pouze do určitých oddělení

Toto je Relational Division with no Remainder (RDNR) problém. Podívejte se na tento článek od Dwain Camps, která nabízí mnoho řešení tohoto druhu problému.

První řešení

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
    )

Druhé řešení

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)

Bez použití GROUP BY a 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. Vyhledávací text Oracle s neanglickými znaky

  2. Fulltextové vyhledávání na mysql pomocí 3písmenného slova

  3. Oracle SQL - Označení záznamů na základě data záznamu vs. historie

  4. Pozor uživatelé používající SQL Server 2008 a SQL Server 2008 R2