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

Откуда: Москва
Сообщений: 436
Добрый день, подскажите пожалуйста как одним запросом проверить что все ребенки есть в таблице.
У одного родителя несколько дочерних объектов (ребенков)

Это таблица tbParamParentChild (ролитель-ребенок)
CREATE TABLE [dbo].[tbParamParentChild](
	[ParentParamID] [int] NOT NULL,
	[ChildParamID] [int] NOT NULL,
 )


Есть вторая таблица tbParamClientReport
CREATE TABLE [dbo].[tbParamClientReport](
	[ParamClientID] [int] NOT NULL,
	[CreateDate] [datetime] NOT NULL,
	[ParamID] [int] NOT NULL,
	...


Как из первой таблице выбрать ParentParamID (родителей), таких что все ее ChildParamID есть в таблице tbParamClientReport в поле ParamID?
Именно все потомки присутствуют, а не один какой из потомков.
29 апр 21, 00:13    [22316049]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 513
Challenger
Как из первой таблицы выбрать ParentParamID (родителей), таких что все ее ChildParamID есть в таблице tbParamClientReport в поле ParamID?
Для этого нужно из первой таблицы выбрать все ParentParamID кроме тех, у которых есть те ChildParamID, которых нет в tbParamClientReport в поле ParamID.
29 апр 21, 01:21    [22316062]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Gerros,
что то не склается паазл в запрос.
Не сомневаюсь, что можно написать, но пазл не складывается
29 апр 21, 10:24    [22316159]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
uaggster
Member

Откуда:
Сообщений: 1003
Challenger, ну ты пример то приведи, чего хочешь получить!
29 апр 21, 10:27    [22316160]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
uaggster
Challenger, ну ты пример то приведи, чего хочешь получить!


Вот пример вытащить все ParentParamID если есть хотя бы один потомок. А нужно список ParentParamID достать, если все потомки есть в tbParamClientReport

  SELECT ParentParamID
    FROM tbParamParentChild(NOLOCK)
    WHERE (ChildParamID IN
	(SELECT ParamID FROM tbParamClientReport(NOLOCK) ))
29 апр 21, 10:37    [22316171]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
uaggster
Member

Откуда:
Сообщений: 1003
Challenger, а как понять, что потомки "все"?
29 апр 21, 10:53    [22316184]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
uaggster
Challenger, а как понять, что потомки "все"?


Для ParentParamID потомки, это все ChildParamID, у которых один и тот же ParentParamID
29 апр 21, 10:59    [22316186]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8587
Challenger,

select .. excep select .. в остатке ничего не должно быть.
29 апр 21, 12:36    [22316255]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
Владислав Колосов
Challenger,

select .. excep select .. в остатке ничего не должно быть.


А можно чуть подробнее.
До конца не понятна идея.
29 апр 21, 15:49    [22316436]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
uaggster
Member

Откуда:
Сообщений: 1003
Challenger, а вы немного внятнее формулируйте, что вы хотите, и вопросы оформляйте согласно правилам форума, тогда, глядишь, и чуть подробнее будет, знаете ли.
А ить, хрустальные шары на складе - закончились.

CREATE TABLE #tbParamParentChild(
	[ParentParamID] [int] NOT NULL,
	[ChildParamID] [int] NOT NULL,
 )

 insert into #tbParamParentChild
 Values
 (1, 1),
 (1, 2),
 (1, 3),
 (1, 4),
 (2, 5),
 (2, 6),
 (2, 7),
 (3, 8),
 (3, 9),
 (4, 10),
 (5, 11),
 (5, 12),
 (8, 13),
 (6, 14)

 CREATE TABLE #tbParamClientReport(
	-- Не нужно для существа задачи
	/* [ParamClientID] [int] NOT NULL, 
	 [CreateDate] [datetime] NOT NULL,
	*/
	[ParamID] [int] NOT NULL
)

insert into #tbParamClientReport
 Values
 (2),
 (3),
 (5),
 (10),
 (11),
 (12),
 (14),
 (8),
 (9)
 
 ; With parent_child as
 (Select a.[ParentParamID], a.[ChildParamID] from #tbParamParentChild a 
 Union all
 Select a.[ParentParamID], b.[ChildParamID]
 from parent_child a inner join #tbParamParentChild b on b.ParentParamID = a.ChildParamID
 Where a.[ParentParamID] <> a.[ChildParamID]
 )
 Select Distinct a.ParentParamID 
	from parent_child a
		Where (Select Count(*) from parent_child b Where a.ParentParamID = b.ParentParamID)
			= (Select Count(*) from parent_child bb inner join #tbParamClientReport c on bb.ChildParamID = c.ParamID Where a.ParentParamID = bb.ParentParamID)
29 апр 21, 16:47    [22316467]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
godsql
Member

Откуда:
Сообщений: 198
Challenger
Владислав Колосов
Challenger,

select .. excep select .. в остатке ничего не должно быть.


А можно чуть подробнее.
До конца не понятна идея.

 select  [ParentParamID] from #tbParamParentChild
 except
 select  [ParentParamID] from #tbParamParentChild
 WHERE (ChildParamID IN
	(SELECT ParamID FROM #tbParamClientReport))
29 апр 21, 19:56    [22316546]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Challenger
Member

Откуда: Москва
Сообщений: 436
godsql
Challenger
пропущено...


А можно чуть подробнее.
До конца не понятна идея.

 select  [ParentParamID] from #tbParamParentChild
 except
 select  [ParentParamID] from #tbParamParentChild
 WHERE (ChildParamID IN
	(SELECT ParamID FROM #tbParamClientReport))


Красивое решение, но оно неправильное.

Оно возвращает всех родителей исключая нужные записи.
30 апр 21, 00:44    [22316612]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8587
Challenger,

а что Вы ожидали? Каков вопрос, таков и ответ. Неточные вопросы дают неточные ответы.
30 апр 21, 17:30    [22317023]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос проверки всех потомков  [new]
Gerros
Member

Откуда: Харьков
Сообщений: 513
Challenger
godsql
пропущено...

 select  [ParentParamID] from #tbParamParentChild
 except
 select  [ParentParamID] from #tbParamParentChild
 WHERE (ChildParamID IN
	(SELECT ParamID FROM #tbParamClientReport))


Красивое решение, но оно неправильное.

Оно возвращает всех родителей исключая нужные записи.


потому что "кроме тех, у которых есть те ChildParamID, которых нет в tbParamClientReport в поле ParamID":
 select  [ParentParamID] from #tbParamParentChild
 except
 select  [ParentParamID] from #tbParamParentChild
 WHERE (ChildParamID NOT IN
	(SELECT ParamID FROM #tbParamClientReport))
30 апр 21, 21:35    [22317090]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить