MS SQL:如何在同一个表中分离出没有子节点的记录?

时间:2009-11-26 11:32:59

标签: sql sql-server tsql

我有一个棘手的问题。我在MS SQL 2005中有一个非常复杂的视图,结果如下:

|  ID  |   Name   |  ParentID  |
--------------------------------
|  1   |   Cars   |     1      |
|  2   |   Audi   |     1      |
|  3   |  Toyota  |     1      |
|  4   |  Trucks  |     4      |

现在我希望我的观点能够识别ID为4的记录中没有子节点,并因此将其分开。

有什么想法吗? ;)

感谢
托本

4 个答案:

答案 0 :(得分:2)

由于父行的ParentID = ID,您希望找到只有给定ParentID的一个实例的那些:

SELECT
   ParentID
FROM
   myTable
GROUP BY
   ParentID
HAVING
   COUNT(1) = 1

答案 1 :(得分:1)

WHERE ParentID NOT IN (SELECT     ParentID 
                 FROM       TABLE 
                 WHERE      ParentID <> ID)

答案 2 :(得分:1)

这些将是那些没有孩子的人:

SELECT a.*
FROM theView a
    LEFT JOIN theView b ON (a.a = b.ParentId AND b.Id <> b.ParentId)
WHERE b.Id IS NULL

但ID 2和ID 3也没有孩子。

答案 3 :(得分:0)

SELECT *
FROM Table as parent
WHERE EXISTS (
  SELECT child.ParentID 
  FROM   Table as child
  WHERE  parent.ParentId = child.id
    and parent.id != child.id
)

如果没有父母的行引用自己,那很简单:

SELECT *
FROM Table as parent
WHERE parent.parentId != parent.id