Выберите родительские записи, где ВСЕ дочерние записи имеют определенный статус - PullRequest
0 голосов
/ 14 сентября 2018

Есть таблица А с записями родителей.В таблице B указаны записи-потомки для записей из таблицы A, связь между которыми осуществляется по родительскому идентификатору.Дети могут иметь статус «открыто» или «закрыто».Родитель может иметь несколько детей в таблице B.

Как отобразить записи из таблицы A, у которых все дети в таблице B закрыты?В противном случае не отображать

Ответы [ 5 ]

0 голосов
/ 14 сентября 2018

Это вернет родителя, если нет дочерней записи (которая может быть неправильной):

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

Возвращает родителя, если есть дочерние записи, и все они «закрыты»:

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
 )
0 голосов
/ 14 сентября 2018

Вы можете использовать объединение для достижения этого

SELECT * FROM Table_A INNER JOIN Table_B on Table_A.Id = Table_B.ParentId WHERE 
Table_B.Status='closed';
0 голосов
/ 14 сентября 2018

Я считаю, что это должно сделать это:

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.

0 голосов
/ 14 сентября 2018

Вы можете проверить, что не существует закрытой записи, используя запрос NOT EXISTS:

SELECT *
FROM TableA
WHERE NOT EXISTS (
    SELECT 1
    FROM TableB
    WHERE TableB.ParentID = TableA.ID
    AND TableB.Status <> 'closed'
)
0 голосов
/ 14 сентября 2018

Попробуйте следующий запрос -

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

SQL Server 2014

...