查询以获取所有子项都具有特定值的父项

时间:2018-12-03 05:08:00

标签: sql oracle

我有2个表PARENT和CHILD,其中CHILD在PARENT中有fk。

父母

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

我正在尝试通过此查询获取所有CHILD.category ='Test1'的父项

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

预期结果,因为所有具有p_id 2的CHILD的类别都具有值'Test1':

p_id|name|address
2   |Bbbb|AddressB

但是我得到这个是因为它返回PARENT,其中CHILD的类别为'Test1':

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

任何人都可以指出我做错了什么地方吗?

3 个答案:

答案 0 :(得分:1)

您可以使用CTE首先仅使用Test1获取那些孩子ID,然后再与父母一起加入。

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; 

Demo

答案 1 :(得分:1)

您的查询在获取结果上处于正确的轨道,它只需要进一步的过滤器即可看到,对于从CHILD中选择的记录,除了Test1之外没有其他记录。

我们可以使用NOT EXISTS条件来做到这一点

 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')

答案 2 :(得分:0)

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条件之一。