Select parent 条记录,其中所有 children 条记录都具有特定状态

Select parent records where ALL children records have a specific status

有 table 个 A 和 records-parents。 在table B 中有records-children 来自table A 的记录,它们之间的关系由parent ID 决定。 Children 的状态可以是 "open" 或 "closed"。 A parent 可以在 table B 中有多个 children。

如何显示tableA中tableB中的children条全部关闭的记录?否则不显示

尝试以下查询-

Select A.* from A join B on A.ID=B.parentID
where B.status='closed'

SQL 服务器 2014

我认为应该这样做:

select a.id
from tablea a
join tableb b on 
  a.id = b.parentid
group by a.id
having count(*) = sum(case when b.status = 'closed' then 1 else 0 end)

此解决方案的关键是比较为特定父级找到的记录数是否等于状态为 closed 的同一父级的记录数。

您可以使用 NOT EXISTS 查询检查是否不存在未关闭的记录:

SELECT *
FROM TableA
WHERE NOT EXISTS (
    SELECT 1
    FROM TableB
    WHERE TableB.ParentID = TableA.ID
    AND TableB.Status <> 'closed'
)

你可以使用 join 来实现这个

SELECT * FROM Table_A INNER JOIN Table_B on Table_A.Id = Table_B.ParentId WHERE 
Table_B.Status='closed';

如果没有子记录(这可能是错误的),这将 return 父:

SELECT *
FROM tabA AS A
WHERE NOT EXISTS
 (
   SELECT * 
   FROM tabB AS B
   WHERE b.Parent = a.id
     AND b.status <> 'closed'
 )

如果有子记录并且所有都是 'closed':

,则此 return 是父记录
SELECT *
FROM tabA
WHERE id IN
 (
   SELECT Parent
   FROM tabB
   GROUP BY Parent
   HAVING Max(CASE WHEN status = 'closed' THEN 0 ELSE 1 END) = 0
 )