Запрос, чтобы получить родителя, где все дети имеют определенное значение - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть 2 таблицы, РОДИТЕЛЯ и РЕБЕНКА, где у РЕБЕНКА есть ФК от РОДИТЕЛЯ.

РОДИТЕЛЯ

p_id|name|address
1   |Aaaa|AddressA
2   |Bbbb|AddressB
3   |Cccc|AddressC

РЕБЕНКА

c_id|name|category|p_id
11  |Zzzz|Test1   |1
12  |Yyyy|Test2   |1
13  |Xyxy|Test1   |1
14  |Wwww|Test1   |2
15  |Vvvv|Test1   |2
16  |Uuuu|Test1   |2
17  |Tttt|Test2   |3
18  |Ssss|Test3   |3
19  |Rrrr|Test2   |3
20  |Qqqq|Test2   |3

Я пытаюсь получить PARENT, где все CHILD.category = 'Test1' с этим запросом

select distinct p.* from PARENT p join CHILD c
    on p.p_id = c.p_id
    where c.category = 'Test1';

Ожидаемый результат, потому что у всех CHILD с p_id 2 есть категория со значением 'Test1':

p_id|name|address
2   |Bbbb|AddressB

Но я получил это, потому что он возвращает PARENT, где РЕБЕНОК имеет категорию =' Test1 ':

p_id|name|address
1   |Aaaa|AddressA
2   |Bbbb|AddressB

Может кто-нибудь помочь указать, где я ошибся?

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018
SELECT distinct p.* 
  FROM PARENT p 
  JOIN CHILD c
    ON p.p_id = c.p_id
 WHERE c.category = 'Test1'
   AND p.p_id = 2;

Это должно вернуть то, что вы хотите.«Aaaa» удовлетворяет всем условиям в вашем запросе.Итак, он возвращается как часть результата.Если вы хотите иметь результат только для p_id = 2, вы должны иметь его как одно из условий WHERE.

0 голосов
/ 03 декабря 2018

Ваш запрос находится на правильном пути для получения результатов, ему просто нужен дополнительный фильтр, чтобы увидеть, что для записей, выбранных вами в CHILD, нет других записей, кроме Test1.

Мы можем сделать это, используя условие НЕ СУЩЕСТВУЕТ

 select distinct p.* 
  from PARENT p 
   join CHILD c1
     on p.p_id = c1.p_id
  where c1.category = 'Test1'
    and not exists(select c2.id
                     from CHILD c2
                    where c2.p_id=c1.p_id 
                      and c2.category <> 'Test1')
0 голосов
/ 03 декабря 2018

Вы можете использовать CTE, чтобы сначала получить эти дочерние идентификаторы только с Test1, а затем присоединить его к родителю.

WITH c 
     AS (SELECT p_id 
         FROM   child 
         GROUP  BY p_id 
         HAVING MAX(category) = MIN(category) 
                AND MAX(category) = 'Test1') 
SELECT p.* 
FROM   parent p 
       JOIN c 
         ON p.p_id = c.p_id; 

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...