powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка на множества (вроде)
10 сообщений из 10, страница 1 из 1
Задачка на множества (вроде)
    #40086886
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Есть задачка:
Требуется для каждого ребёнка найти все возможные подарки, которые сделают его семью счастливой: в подарке будут все любимые конфеты ребёнка, а также конфеты, которые он не любит –– они достанутся маме, и она будет счастлива, а если счастлива мама, то папа тоже доволен.

Файл прикрепил с данными.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as(
	select ch.Id,fio, id_Present, cc.id_candy,p.Code
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
		inner join candies as can on can.id = cc.id_candy
		inner join present_and_candy as ps on ps.id_candy = can.id
		inner join  Presents as p on p.Id = ps.Id_Present
	
)
select *
from a
order by fio, id_Present, id_candy
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086887
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ответ, который должен получится.
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086888
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чтобы получить нужный ответ, то я должен каким-то образом сгруппировать выделенные строки.
Пытался через
Код: sql
1.
INTERSECT

- не получалось. Просто выдавало пересечение, которое и так было во втором запросе (ниже INTERSECT).
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086933
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sysn1k,

Перефразируя, выберите из всех наборов те, которые содержат все конфеты из списка ребёнка, причем в наборе должна содержаться минимум одна конфета не из его списка.

То есть конфеты набора должна удовлетворять двум условиям: exist (все конфеты из списка ребенка) and not exists (конфеты в списке ребёнка).
Надо понять - а как определить, что все конфеты были проверены из пожеланий ребёнка?
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086957
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with a as(
	select ch.Id,fio, id_Present, cc.id_candy,p.Code
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
		inner join candies as can on can.id = cc.id_candy
		inner join present_and_candy as ps on ps.id_candy = can.id
		inner join  Presents as p on p.Id = ps.Id_Present	
		),
	b as (
	select Id_child, Id_candy
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
	where id = 1
	)
select *
from a
where  exists (select * from b
			   where b.Id_child = a.Id and a.Id_candy = b.Id_candy)

order by fio, id_Present, id_candy



На скрине выделил какие данные нужно вытащить. Выделенные данные - это подарки, которые полностью совпадают с любимыми конфетами ребенка 'А' или id = 1 (Подарок W, W3). А вот подарки W2 и W4 не подходят - они содержат только часть любимых конфет. Сбоку на скрине я указал какой ребенок какие конфеты любит.

Я не знаю как SQL указать, чтобы он вытащил только полное совпадение из CTE b (W, W3), а не с полным + частичным совпадением(что у меня в итоге и получилось).
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086959
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это результат из CTE b
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086968
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этож очень простенькая задачка для ясельников

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with a as(
	select ch.Id, ch.fio, id_Present --, cc.id_candy,p.Code
	from CHILDREN as ch inner join Presents as p 
		 on not exists( select Id_candy from child_and_candy as cc where Id_child = ch.id except select Id_candy from present_and_candy as ps where Id_Present = p.id )
		    and exists( select Id_candy from present_and_candy as ps where Id_Present = p.id  except select Id_candy from child_and_candy as cc where Id_child = ch.id )
		--inner join child_and_candy as cc on ch.id = cc.id_child
		--inner join candies as can on can.id = cc.id_candy
		--inner join present_and_candy as ps on ps.id_candy = can.id
)
select *
from a
order by fio, id_Present, id_candy
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086992
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222, я забил болт на пересечения. Решил, но скорее всего, костыльным способом.
в CTE 'b' я посчитал количество любимых конфет для каждого ребенка. 'c' и 'd' - это промежуточные CTE. В конце я уже сравнивал количество любимых конфет с количеством нахождения любимых конфет в подарке. Например:
У ребенка 'A' - 3 любимых конфет. Из 4 подарков встречается только 2 подарка, где все 3 любимых конфет находится, если даже конфет в подарке находится больше (поэтому >=).

Код: 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 a as(
	select ch.Id,fio, id_Present, cc.id_candy,p.Code
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
		inner join candies as can on can.id = cc.id_candy
		inner join present_and_candy as ps on ps.id_candy = can.id
		inner join  Presents as p on p.Id = ps.Id_Present	
		),
	b as (
	select FIO,Id_child, count(Id_candy) as strok
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
	group by FIO,Id_child
	), 
	c as (
	select fio,Id_child, strok from b 
	), 
	d as( 
	select id, fio, code, count(code) as kol
	from a 		   				 
	group by id, fio ,code
	)
select d.FIO, code from d inner join b on d.Id = b.Id_child
where kol >= strok
order by code
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40086995
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Задачка на множества (вроде)
    #40087003
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sysn1k
aleks222, я забил болт на пересечения. Решил, но скорее всего, костыльным способом.
в CTE 'b' я посчитал количество любимых конфет для каждого ребенка. 'c' и 'd' - это промежуточные CTE. В конце я уже сравнивал количество любимых конфет с количеством нахождения любимых конфет в подарке. Например:
У ребенка 'A' - 3 любимых конфет. Из 4 подарков встречается только 2 подарка, где все 3 любимых конфет находится, если даже конфет в подарке находится больше (поэтому >=).

Код: 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 a as(
	select ch.Id,fio, id_Present, cc.id_candy,p.Code
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
		inner join candies as can on can.id = cc.id_candy
		inner join present_and_candy as ps on ps.id_candy = can.id
		inner join  Presents as p on p.Id = ps.Id_Present	
		),
	b as (
	select FIO,Id_child, count(Id_candy) as strok
	from CHILDREN as ch
		inner join child_and_candy as cc on ch.id = cc.id_child
	group by FIO,Id_child
	), 
	c as (
	select fio,Id_child, strok from b 
	), 
	d as( 
	select id, fio, code, count(code) as kol
	from a 		   				 
	group by id, fio ,code
	)
select d.FIO, code from d inner join b on d.Id = b.Id_child
where kol >= strok
order by code


Бред. Да еще и напрягающий сервер.

ЗЫ. Можно и без except. Но уж точно, группировки не нужно.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with cc as ( select * from child_and_candy ) 
   , ps as ( select * from present_and_candy ) 
   , a as ( 
	select ch.Id, ch.fio, id_Present
	from CHILDREN as ch left outer join Presents as p 
		 on not exists( select * from ( select * from cc where Id_child = ch.id ) as cc left outer join ( select * from ps where Id_Present = p.id ) as ps on cc.Id_candy = ps.Id_candy where ps.Id_candy is null )
		    and exists( select * from ( select * from ps where Id_Present = p.id ) as ps left outer join ( select * from cc where Id_child = ch.id ) as cc on cc.Id_candy = ps.Id_candy where cc.Id_candy is null )
)
select *
from a
order by fio, id_Present
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка на множества (вроде)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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