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
)
有 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
)