Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение списка по нескольким строкам.  [new]
Кабысдох
Member

Откуда:
Сообщений: 85
Доброго времени суток!

Есть таблица - назовем ее
"Рецепты" (TabR)
ГОТОВОЕ ИЗДЕЛИЕ СЫРЬЕ
ХЛЕБ МУКА
ХЛЕБ МАСЛО
ХЛЕБ ЯЙЦА
ХЛЕБ СОЛЬ
ЯИЧНИЦА ЯЙЦА
ЯИЧНИЦАСОЛЬ
ОЛИВЬЕ ЯЙЦА
ОЛИВЬЕ МАЙОНЕЗ
БУЛКА МУКА
БУЛКА ЯЙЦА


И таблица
"Вводные данные для анализа" (TabA)
Входные
ЯЙЦА
СОЛЬ


Надо найти из рецептов те готовые изделия, в которые входят ВСЕ вводные данные.
Т.е. в результате:
Результат
ХЛЕБ
ЯИЧНИЦА


Написал как
select distinct tr.[Готовое изделие]
		from TabR tr 
		inner join TabA ta on ta.[Входные] = tr.[Сырье]
		group by tr.[Готовое изделие]
		having count(tr.[Готовое изделие]) = (select count(*) from TabA)


Чувствую, что кривовато - сравнивать по count... Может, есть более красивые альтернативные решения или это я туплю?
30 янв 19, 15:41    [21797942]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение списка по нескольким строкам.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Это называется "Реляционное деление" - поискать в Google и в данном форуме.
"Найти записи в таблице [Рецепты] такие, что не существует записи в [Вводных данных] которой не существует в таблице [Рецепты] для данного готового изделия".
Надо всего лишь перевести эту фразу на английский язык:
WITH TabR AS(SELECT * FROM(VALUES
 ('ХЛЕБ','МУКА')
,('ХЛЕБ','МАСЛО')
,('ХЛЕБ','ЯЙЦА')
,('ХЛЕБ','СОЛЬ')
,('ЯИЧНИЦА','ЯЙЦА')
,('ЯИЧНИЦА','СОЛЬ')
,('ОЛИВЬЕ','ЯЙЦА')
,('ОЛИВЬЕ','МАЙОНЕЗ')
,('БУЛКА','МУКА')
,('БУЛКА','ЯЙЦА')
)T([Готовое изделие],[Сырьё])
)
,TabA AS(SELECT * FROM(VALUES
 ('ЯЙЦА')
,('СОЛЬ')
)T([Вводные данные для анализа])
)
SELECT DISTINCT [Результат]=[Готовое изделие] FROM TabR R WHERE NOT EXISTS
(
 SELECT * FROM TabA WHERE NOT EXISTS
 (
  SELECT * FROM TabR RR WHERE RR.[Готовое изделие]=R.[Готовое изделие] AND RR.[Сырьё]=TabA.[Вводные данные для анализа]
 )
);
30 янв 19, 16:27    [21798011]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение списка по нескольким строкам.  [new]
Кабысдох
Member

Откуда:
Сообщений: 85
iap
Это называется "Реляционное деление" - поискать в Google и в данном форуме.
"Найти записи в таблице [Рецепты] такие, что не существует записи в [Вводных данных] которой не существует в таблице [Рецепты] для данного готового изделия".
Надо всего лишь перевести эту фразу на английский язык:
WITH TabR AS(SELECT * FROM(VALUES
 ('ХЛЕБ','МУКА')
,('ХЛЕБ','МАСЛО')
,('ХЛЕБ','ЯЙЦА')
,('ХЛЕБ','СОЛЬ')
,('ЯИЧНИЦА','ЯЙЦА')
,('ЯИЧНИЦА','СОЛЬ')
,('ОЛИВЬЕ','ЯЙЦА')
,('ОЛИВЬЕ','МАЙОНЕЗ')
,('БУЛКА','МУКА')
,('БУЛКА','ЯЙЦА')
)T([Готовое изделие],[Сырьё])
)
,TabA AS(SELECT * FROM(VALUES
 ('ЯЙЦА')
,('СОЛЬ')
)T([Вводные данные для анализа])
)
SELECT DISTINCT [Результат]=[Готовое изделие] FROM TabR R WHERE NOT EXISTS
(
 SELECT * FROM TabA WHERE NOT EXISTS
 (
  SELECT * FROM TabR RR WHERE RR.[Готовое изделие]=R.[Готовое изделие] AND RR.[Сырьё]=TabA.[Вводные данные для анализа]
 )
);


Спасибо!!! Век живи - век учись...
30 янв 19, 17:12    [21798068]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение списка по нескольким строкам.  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3663
Кабысдох

Спасибо!!! Век живи - век учись...


да, и то , как известно, лишь потеря времени
30 янв 19, 18:08    [21798140]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение списка по нескольким строкам.  [new]
KRS544
Member

Откуда:
Сообщений: 497
WITH TabR AS(SELECT * FROM(VALUES
 ('ХЛЕБ','МУКА')
,('ХЛЕБ','МАСЛО')
,('ХЛЕБ','ЯЙЦА')
,('ХЛЕБ','СОЛЬ')
,('ЯИЧНИЦА','ЯЙЦА')
,('ЯИЧНИЦА','СОЛЬ')
,('ОЛИВЬЕ','ЯЙЦА')
,('ОЛИВЬЕ','МАЙОНЕЗ')
,('БУЛКА','МУКА')
,('БУЛКА','ЯЙЦА')
)T([Готовое изделие],[Сырьё])
)
,TabA AS(SELECT * FROM(VALUES
 ('ЯЙЦА')
,('СОЛЬ')
)T([Вводные данные для анализа])
)
select r.[Готовое изделие]
from TabR r inner join  TabA a on r.[Сырьё]=a.[Вводные данные для анализа]
group by r.[Готовое изделие]
having count(*)=2

Будет работать, если нет повторов...
30 янв 19, 18:30    [21798160]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение списка по нескольким строкам.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
KRS544
Будет работать, если нет повторов...

ну и только два ингридиента, а так да юудет работать
30 янв 19, 18:35    [21798165]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение списка по нескольким строкам.  [new]
Кабысдох
Member

Откуда:
Сообщений: 85
TaPaK
KRS544
Будет работать, если нет повторов...

ну и только два ингридиента, а так да юудет работать

Поэтому и ставил в первом примере:

having count(tr.[Готовое изделие]) = (select count(*) from TabA)


Интересовала "красота" решения, да и скорость выполнения...
30 янв 19, 23:09    [21798334]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить