Вернуть родительский идентификатор, если все дочерние элементы, ссылающиеся на родительский идентификатор, имеют выбранное значение - PullRequest
1 голос
/ 13 апреля 2020

Я столкнулся с каким-то странным случаем на работе. Мне нужно определить все элементы в таблице, которые ссылаются на своих родителей и те, которые имеют определенное значение. Например,

id  | parentID | fieldValue
---------------------------
123    null      null
  124    123       2
  125    123       2
126    null      null
  127    126       2
  128    126       1

Учитывая приведенный выше пример, если бы мой подвыбор должен был искать всех детей с fieldValue, равным «2», я бы хотел получить только идентификатор 123, так как у 126 есть ребенок с 1 значение.

Цель состоит в том, чтобы:

HasParentID не был равен нулю, если значение поля ALL OTHER children = 2, вернуть parentID.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2020

Вы можете group by parentID и установить условия в предложении having:

select parentID
from tablename
group by parentID
having count(distinct fieldValue) = 1 and max(fieldValue) = '2'
1 голос
/ 13 апреля 2020

Вы можете использовать предложение NOT EXISTS, чтобы проверить, что у parentID нет потомков с fieldValue, отличным от 2:

SELECT DISTINCT parentID
FROM data d1
WHERE d1.fieldValue = 2
  AND d1.parentID IS NOT NULL
  AND NOT EXISTS (SELECT *
                  FROM data d2
                  WHERE d2.parentID = d1.parentID AND d2.fieldValue != 2)

Демонстрация на SQLFiddle

0 голосов
/ 13 апреля 2020

Вы можете сделать что-то вроде этого

SELECT DISTINCT parentID 
  FROM data
  WHERE fieldValue = 2
    AND parentID NOT IN 
      (SELECT parentId 
       FROM data
       WHERE fieldValue != 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...