Как извлечь записи из таблицы, которая соответствует всем значениям в другой таблице - PullRequest
2 голосов
/ 04 июля 2019

Как написать запрос, который выбирает всех драйверов, которые управляют всеми доступными шинами?

СТОЛЬНЫЙ АВТОБУС

--------
BUS_ID
--------
1
2
3
4

СТОЛОВЫЙ ВОДИТЕЛЬ

-----------------------
BUS_ID  |   DRIVER_NAME
-----------------------
1   |   John
2   |   John
1   |   Max
2   |   Max
3   |   Max
4   |   Max
2   |   Bill
3   |   Ron
4   |   Ron
1   |   Ron
2   |   Ron

В этом примере он должен вернуть

DRIVER_NAME
-----------
Max
Ron

Примечание. Не задавайте жестко любые значения в запросе.

Я написал следующее

SELECT DRIVER.DRIVER_NAME
FROM   DRIVER
WHERE  BUS_ID = ALL( SELECT BUS_ID FROM BUS);

Ответы [ 3 ]

1 голос
/ 04 июля 2019

Использовать grouping с having предложением:

SELECT D.DRIVER_NAME
  FROM DRIVER D
 GROUP BY D.DRIVER_NAME
HAVING COUNT(*) = (SELECT COUNT(*) FROM BUS);

DRIVER_NAME
-----------
Ron
Max

Демо

1 голос
/ 04 июля 2019

Соедините таблицы, сгруппируйте их по d.driver_name и поместите условие в предложение, имеющее:

select 
  d.driver_name
from bus b inner join driver d
on d.bus_id = b.bus_id
group by d.driver_name
having count(*) = (select count(*) from bus)
0 голосов
/ 04 июля 2019

Попробуйте:

SELECT DISTINCT DRIVER_NAME FROM
(SELECT D.DRIVER_NAME, 
COUNT(DISTINCT BUS_ID) OVER (PARTITION BY D.DRIVER_NAME) INDVDL,
COUNT(DISTINCT BUS_ID) OVER () TOTAL
  FROM DRIVER D)
 WHERE INDVDL = TOTAL

- обновление -

SELECT DISTINCT
    DRIVER_NAME
FROM
    (
        SELECT
            D.DRIVER_NAME,
            COUNT(DISTINCT BUS_ID) OVER(
                PARTITION BY D.DRIVER_NAME
            ) INDVDL,
            B.TOTAL   AS TOTAL
        FROM
            DRIVER D JOIN
            (
                SELECT
                    COUNT(1) AS TOTAL
                FROM
                    BUS
            ) B ON (1=1)
    )
WHERE
    INDVDL = TOTAL;

Ура !!

...