Как выбрать родительские строки, у которых нет дочерних и дочерних строк, у которых есть родительские строки - PullRequest
2 голосов
/ 29 февраля 2012

У меня немного сложный запрос.
У меня есть стол

tbl_Categories {CategoryID, Name, CategoryId_fk}

и это таблица с собственными ссылками . Когда CategoryId_fk равно NULL, тогда эта строка является parent , когда есть значение, которое является child . У меня есть проблема, чтобы выбрать все дочерние элементы (это где CategoryId_fk это не null) и строки, где CategoryId_fk это null и не имеет детей. Я пытался что-то, но не работает:

SELECT a.*
FROM tbl_Categories a
WHERE NOT EXISTS (
    SELECT 1 FROM tbl_Categories b
    WHERE b.CategoryId_fk= a.CategoryId_fk
)

1 Ответ

2 голосов
/ 29 февраля 2012

Вы сопоставили b и a на внешнем ключе.

Возможно, я неверно истолковал ваш вопрос, в большинстве случаев пользователи хотят найти всех потомков для данного родителя, но приведенный ниже запрос возвращает то, что, на мой взгляд, вам нужно.

/* All parents without children */
SELECT  a.*
FROM    tbl_Categories a
WHERE   NOT EXISTS (
          SELECT * 
          FROM   tbl_Categories b
          WHERE  b.CategoryId_fk = a.CategoryId
)
/* All children */
UNION ALL
SELECT  a.*
FROM    tbl_Categories a
WHERE   CategoryId_fk IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...