基于子记录上的多个条件获取父记录的SQL查询
我有两个表父p和子C 家长基于子记录上的多个条件获取父记录的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
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)