Sql 查询以获取所有子项都具有特定值的父项
我有两个表,父表和子表,其中子表具有来自父表的fk 母公司 孩子 我正在尝试使用此查询获取PARENT,其中all CHILD.category='Test1'Sql 查询以获取所有子项都具有特定值的父项,sql,oracle,Sql,Oracle,我有两个表,父表和子表,其中子表具有来自父表的fk 母公司 孩子 我正在尝试使用此查询获取PARENT,其中all 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的子级都具有值为“Test1”的类别: p_id|name|address 2 |Bbbb|Add
select distinct p.* from PARENT p join CHILD c
on p.p_id = c.p_id
where c.category = 'Test1';
预期结果,因为所有p_id为2的子级都具有值为“Test1”的类别:
p_id|name|address
2 |Bbbb|AddressB
但我得到这个结果是因为它返回父级,其中子级的category='Test1':
p_id|name|address
1 |Aaaa|AddressA
2 |Bbbb|AddressB
有人能帮我指出我哪里做错了吗?您可以使用CTE首先只使用Test1获取这些子ID,然后将其与父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;
您可以使用CTE首先只使用Test1获取这些子ID,然后将其与父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;
这应该会返回您想要的内容。
“Aaaa”满足查询中的所有条件。因此,它作为结果的一部分返回。如果只想得到p_id=2的结果,则应将其作为WHERE条件之一
这应该会返回您想要的内容。
“Aaaa”满足查询中的所有条件。因此,它作为结果的一部分返回。如果您只想得到p_id=2的结果,则应将其作为WHERE条件之一。您的查询在获得结果方面是正确的,它只需要进一步筛选,就可以看到除了从CHILD中选择的记录的Test1之外,没有其他记录 我们可以使用notexists条件来实现这一点
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')
您的查询在获得结果方面走在了正确的轨道上,它只需要进一步的筛选就可以看到,对于您从CHILD中选择的记录,除了Test1之外,没有其他记录 我们可以使用notexists条件来实现这一点
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')
我现在已经改正了。第一个孩子的别名设置不正确我知道它将是第一个孩子的别名,但answwer是如何被接受的??:-我现在已经改正了。第一个孩子的别名设置不正确我知道它将是第一个孩子的别名,但answwer是如何被接受的??:-
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')