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()表达式。