Sql 需要帮助选择所有孩子都有结束日期的案例吗

Sql 需要帮助选择所有孩子都有结束日期的案例吗,sql,sql-server,tsql,Sql,Sql Server,Tsql,我知道标题令人困惑,但我需要帮助确定哪些法庭案件的所有与该案件相关的儿童都有一个确定日期。 我可以运行此查询: CaseInfo Table CaseID, CaseNumber, CaseName CaseChild Table CaseID, FK to CaseInfo ChildPartyID, FK to PartyID in Party table ProgramClosureDate Party Table ID, PartyID, Firstname, L

我知道标题令人困惑,但我需要帮助确定哪些法庭案件的所有与该案件相关的儿童都有一个确定日期。 我可以运行此查询:

CaseInfo Table
CaseID,
CaseNumber,
CaseName

CaseChild Table
CaseID,           FK to CaseInfo
ChildPartyID, FK to PartyID in Party table
ProgramClosureDate

Party Table
ID,
PartyID,
Firstname,
LastName

SELECT           ci.CaseNumber, ci.CaseName, p.firstname+' '+p.lastname AS child, 
                 ci.programClosureDate
FROM             CaseInfo ci JOIN
                 CaseChild cc ON ci.CaseID = cc.CaseID JOIN
                 Party p ON cc.ChildPartyID = p.PartyID

WHERE            cc.ProgramClosureDate IS NOT NULL                    
ORDER BY         ci.CaseName
但这只会让我知道programClosureDate不为NULL的孩子。
非常感谢您的帮助。
Andy

您可以在WHERE条件下使用此选项

Where CaseID not in (Select CaseID  from CaseChild ProgramClosureDate IS NULL )

此查询将获取所有子项都有结束日期的情况

select CaseId
from CaseChild cc
group by CaseId
having count(*) = count(cc.ProgramClosureDate)
它使用了一个小技巧
count(*)
是每种情况下的记录数,
count(cc.ProgramCLosureDate)
是非空结束日期数。当所有案例都关闭时,这些都是相同的

如果您想了解更多信息,可以加入:

select ci.CaseNumber, ci.CaseName, p.firstname+' '+p.lastname AS child, 
       ci.programClosureDate
from (select CaseId
      from CaseChild cc
      group by CaseId
      having count(*) = count(cc.ProgramClosureDate)
     ) closed join
     CaseInfo ci
     on closed.CaseId = ci.CaseId join
     Party p
     ON cc.ChildPartyID = p.PartyID
order by ci.CaseName
上面的子查询用于定义查询其余部分的填充。

另一种方法。。。 我不确定建议的不同方法的性能,最好测试一下

;WITH OpenCases AS
(
    SELECT DISTINCT CaseID
    FROM CaseChild
    WHERE ProgramClosureDate IS NULL
)
SELECT   ci.CaseNumber
        ,ci.CaseName
        ,child  = p.firstname+' '+p.lastname
        ,ci.programClosureDate
FROM CaseInfo   ci 
JOIN CaseChild  cc  ON ci.CaseID = cc.CaseID
JOIN OpenCases  oc  ON ci.CaseID != oc.CaseID
JOIN Party      p   ON cc.ChildPartyID = p.PartyID
WHERE cc.ProgramClosureDate IS NOT NULL                    
ORDER BY ci.CaseName

什么版本的sql server,从2008年起您可以使用all关键字。这很好!!感谢您解释Count()表达式。