我有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
任何人都可以指出我做错了什么地方吗?
答案 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;
答案 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条件之一。