【问题标题】:SQL - Identifying NULL/0 Child RecordsSQL - 识别 NULL/0 子记录
【发布时间】:2014-07-17 21:54:15
【问题描述】:

大家早上好,

我正在尝试确定父合同没有任何子合同且状态为“待定”的法律合同类型。需要注意的一件主要事情是,父合同可以有多个具有不同状态的子合同,除了待处理(例如,父合同 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;

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

提前致谢!

【问题讨论】:

  • 我必须问 - 加入是否意味着将 parentcontractid 加入到自身?
  • @JaazCole 确实应该如下所示,所有合同都在合同表中,唯一的“子”标识符是如果同时存在父合同 ID 和合同 ID:ccon.parentcontractid = pcon .contractid

标签: sql null


【解决方案1】:

因为您使用的是隐式 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;

【讨论】:

    【解决方案2】:

    除非我误读了您的帖子,否则我认为您可以通过使用 IN 或 EXISTS 来简化这一点。 既然你得到了所有的 parentcontractid 只是......

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多