Каким способом ещё можно решить данную задачу по 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));