Каким способом ещё можно решить данную задачу по sql?

Структура базы данных: http://sqlfiddle.com/#!9/a2a429/3
Таблица s - поставщики
p - товары, поставляемые поставщиками
sp - поставки товаров
Стоит задача:
Определить номера поставщиков, поставляющих, по меньшей мере, все детали, поставляемые поставщиком 2 (Jones)
Решил эту задачу так:

select * from sp 
join s on s.s=sp.s
where sp.s<>2
and sp.p in (select sp.p from sp where sp.s=2)
group by sp.s 
having count(*)=(select count(*) from sp where sp.s=2)  

меня интересует то, что это выражение (select sp.p from sp where sp.s=2) вызывается дважды.
Правильно ли я решил данную задачу, или есть более правильное решение?


Ответы (1 шт):

Автор решения: Miron

Можно так(использовался трюк с join, с помощью которого определялось, является ли одно множество подмножеством другого):

SELECT
    *
FROM
    s as seller
WHERE
    seller.s != 2
AND
    (not exists(
        SELECT
            *
        FROM
            (SELECT
                p as id
            FROM
                sp
            WHERE
                s = 2
            ) as _subset
        LEFT JOIN
            (SELECT
                p as id
            FROM
                sp
            WHERE
                seller.s = sp.s
          ) as _set
        ON
            _subset.id = _set.id
        WHERE
            _set.id is NULL)
OR
    not exists(
        SELECT
            *
        FROM
            sp
        WHERE
            sp.s = 2));
→ Ссылка