Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询以获取所有子项都具有特定值的父项_Sql_Oracle - Fatal编程技术网

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

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

我有两个表,父表和子表,其中子表具有来自父表的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|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')