Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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_Database_Oracle - Fatal编程技术网

基于子记录上的多个条件获取父记录的SQL查询

基于子记录上的多个条件获取父记录的SQL查询,sql,database,oracle,Sql,Database,Oracle,我有两个表父p和子C 家长 Id Name 1 AAA 2 BBB 3 CCC 儿童 Id ParId Name Value 11 1 XXX 1 12 1 YYY 7 19 1 ZZZ 9 13 2 XXX 1 14 2 YYY 2 20 1 ZZZ 7 15 3 XXX 1 16 3 YYY 2 18 3 ZZZ 8 我想获取XXX值为1且YYY不是2

我有两个表父p和子C

家长

Id Name
1   AAA
2   BBB
3   CCC
儿童

Id ParId Name Value
11 1     XXX    1
12 1     YYY    7
19 1     ZZZ    9
13 2     XXX    1
14 2     YYY    2
20 1     ZZZ    7
15 3     XXX    1
16 3     YYY    2
18 3     ZZZ    8
我想获取XXX值为1且YYY不是2或zzz值不是7的父记录。
在这种情况下,我应该得到1和3作为结果。请建议。

可以在带有
CASE
语句的查询的
HAVING
部分中检查规则

select distinct p.id 
from parent p 
join child c 
    on p.id=c.parid 
where (c.name='XXX' and c.value = 1) or (c.name='YYY' and c.value = 2) or ...
如果必须检查所有名称,也就是说,如果子项没有全部三个名称,那么它不应该出现在结果集中,那么对三个规则的检查是静态的

SELECT c.ParId, p.Name
FROM   Child c
       INNER JOIN Parent p ON c.ParID = p.Id
GROUP BY c.ParId, p.Name
HAVING SUM(CASE WHEN c.Name = 'XXX' AND c.Value = 1 Then 1
                WHEN c.Name = 'YYY' AND c.Value <> 2 Then 1
                WHEN c.Name = 'ZZZ' AND c.Value <> 7 Then 1
                ELSE 0
           END) = 3;
选择c.ParId,p.Name
来自儿童c
c.ParID=p.Id上的内部联接父级p
按c.ParId、p.名称分组
有和(c.Name=XXX,c.Value=1,则为1)
当c.Name='YYY'和c.Value为2时,则为1
当c.Name='ZZZ'和c.Value为7时,则为1
其他0
结束)=3;
如果只需检查数据中的名称,即如果子项只有“XXX”且其值为1,则其父项应在结果集中,则检查是动态的

SELECT c.ParId, p.Name
FROM   Child c
       INNER JOIN Parent p ON c.ParID = p.Id
WHERE  c.NAME IN ('XXX', 'YYY', 'ZZZ')
GROUP BY c.ParId, p.Name
HAVING SUM(CASE WHEN c.Name = 'XXX' AND c.Value = 1 Then 1
                WHEN c.Name = 'YYY' AND c.Value <> 2 Then 1
                WHEN c.Name = 'ZZZ' AND c.Value <> 7 Then 1
                ELSE 0
           END) = COUNT(DISTINCT c.NAME)
选择c.ParId,p.Name
来自儿童c
c.ParID=p.Id上的内部联接父级p
其中c.NAME位于('XXX','YYY','ZZZ')
按c.ParId、p.名称分组
有和(c.Name=XXX,c.Value=1,则为1)
当c.Name='YYY'和c.Value为2时,则为1
当c.Name='ZZZ'和c.Value为7时,则为1
其他0
结束)=计数(不同的c.NAME)

对于parId=3,YYY是2,那么它怎么会包含在结果中呢?请同时给出预期的结果集。如果有值为1的XXX,但没有YYY和/或ZZZ,该怎么办?
SELECT c.ParId, p.Name
FROM   Child c
       INNER JOIN Parent p ON c.ParID = p.Id
WHERE  c.NAME IN ('XXX', 'YYY', 'ZZZ')
GROUP BY c.ParId, p.Name
HAVING SUM(CASE WHEN c.Name = 'XXX' AND c.Value = 1 Then 1
                WHEN c.Name = 'YYY' AND c.Value <> 2 Then 1
                WHEN c.Name = 'ZZZ' AND c.Value <> 7 Then 1
                ELSE 0
           END) = COUNT(DISTINCT c.NAME)