SQL - 识别NULL / 0子记录

时间:2014-05-28 15:18:38

标签: sql null

大家早上好,

我正在尝试确定父母合同中没有任何具有“待定”状态的子合同的合法合同类型。需要注意的一点是,父母合同除了待定之外可以有多个具有不同状态的子合同(例如,父母合同1可以有4个子合同,每个具有不同的状态,例如“活动”,“审核中”,“正在处理中”等等。)

select
pcon.parentcontractid,
count(ccon.childcontractid)
from
tblcontract pcon,
tblcontract ccon
where
ccon.parentcontractid = pcon.parentcontractid
and ccon.contract_type = 'CHILD CONTRACT'
and pcon.contract_status in ('Active','Pending')
and pcon.group = 'Legal'
and ccon.stat_cd = 'Pending'
group by pcon.parentcontractid;

^^有计数(ccon.childcontractid)= o导致没有结果,但是在数据库中有这种情况的例子,所以我在这里有问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

因为您使用的是隐式INNER JOIN,所以永远不会将0作为计数,因为这些记录不会包含在内。您要找的是LEFT OUTER JOIN。这会保留“左”表中的所有行。

此查询应该可以解决问题:

SELECT pcon.parentcontractid, COUNT(ccon.childcontractid)
FROM tblcontract pcon
LEFT OUTER JOIN tblcontract ccon
ON ccon.parentcontractid = pcon.parentcontractid 
AND ccon.contract_type = 'CHILD CONTRACT'
AND ccon.stat_cd = 'Pending'
WHERE pcon.contract_status IN ('Active','Pending')
AND pcon.group = 'Legal'
GROUP BY pcon.parentcontractid;

答案 1 :(得分:0)

除非我误读你的帖子,否则我认为你可以通过使用IN或EXISTS来简化这一点。 因为你无论如何都得到了所有的家长...

SELECT * 
FROM tblcontract 
WHERE parentcontractid NOT IN(SELECT c.parentcontractid 
                          FROM tblcontract c
                          WHERE c.contract_type = 'CHILD CONTRACT' 
                             and c.stat_cd = 'Pending')