如何选择没有包含父行的子级和子级的父级行

时间:2012-02-29 15:13:57

标签: sql sql-server sql-server-2008 tsql

我的查询有点复杂。
我有桌子

tbl_Categories {CategoryID, Name, CategoryId_fk}

它是一个自引用表。 当CategoryId_fkNULL时,如果该值为子级,则该行为父级。 我有问题选择所有孩子(CategoryId_fk不是null)和CategoryId_fknull并且没有孩子的行。 我尝试了一些但不起作用:

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

1 个答案:

答案 0 :(得分:2)

您已在外键上匹配ba

我可能会误解你的问题,大多数时候用户想要找到给定父级的所有孩子,但是在查询之下会返回我认为你需要的东西。

/* 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