powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение списка по нескольким строкам.
7 сообщений из 7, страница 1 из 1
Сравнение списка по нескольким строкам.
    #39767135
Кабысдох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

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

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

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

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



Чувствую, что кривовато - сравнивать по count... Может, есть более красивые альтернативные решения или это я туплю?
...
Рейтинг: 0 / 0
Сравнение списка по нескольким строкам.
    #39767193
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется "Реляционное деление" - поискать в Google и в данном форуме.
"Найти записи в таблице [Рецепты] такие, что не существует записи в [Вводных данных] которой не существует в таблице [Рецепты] для данного готового изделия".
Надо всего лишь перевести эту фразу на английский язык:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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.[Вводные данные для анализа]
 )
);
...
Рейтинг: 0 / 0
Сравнение списка по нескольким строкам.
    #39767223
Кабысдох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapЭто называется "Реляционное деление" - поискать в Google и в данном форуме.
"Найти записи в таблице [Рецепты] такие, что не существует записи в [Вводных данных] которой не существует в таблице [Рецепты] для данного готового изделия".
Надо всего лишь перевести эту фразу на английский язык:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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.[Вводные данные для анализа]
 )
);



Спасибо!!! Век живи - век учись...
...
Рейтинг: 0 / 0
Сравнение списка по нескольким строкам.
    #39767256
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кабысдох
Спасибо!!! Век живи - век учись...

да, и то , как известно, лишь потеря времени
...
Рейтинг: 0 / 0
Сравнение списка по нескольким строкам.
    #39767264
KRS544
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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


Будет работать, если нет повторов...
...
Рейтинг: 0 / 0
Сравнение списка по нескольким строкам.
    #39767265
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KRS544Будет работать, если нет повторов...
ну и только два ингридиента, а так да юудет работать
...
Рейтинг: 0 / 0
Сравнение списка по нескольким строкам.
    #39767342
Кабысдох
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKKRS544Будет работать, если нет повторов...
ну и только два ингридиента, а так да юудет работать
Поэтому и ставил в первом примере:

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



Интересовала "красота" решения, да и скорость выполнения...
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение списка по нескольким строкам.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]