2009-11-26 17 views
0

我有一个棘手的问题。我在MS SQL 2005,结果如下一个非常复杂的观点:MS SQL:如何分离在同一个表中没有子项的记录?

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

现在我想我的观点认识到,ID为4的记录有没有孩子,正因为如此,它分离出来。

任何想法? ;)

感谢
托本

+0

该行不具有父,是他们总是引用本身? – 2009-11-26 11:41:57

+0

是的,他们是。但问题是,第一行始终引用自身。这只是两个层次的基本范例,也可能有四个或五个层次。 – Torben 2009-12-01 08:24:41

回答

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也没有孩子。

+0

我明白......解决问题的唯一方法是一种新观点,即将第一种观点与自身联系起来。谢谢。 – Torben 2009-12-01 08:27:48

+0

Torben H.请不要写意见,参考意见!写一个存储的proc或其他东西。引用视图的视图是性能杀手(你不能索引引用另一个视图的视图),应该避免。 – HLGEM 2009-12-02 22:21:36

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

由于ParentID = ID为父行,你想找到的人只有有一个给定的PARENTID的一个例如:

SELECT 
    ParentID 
FROM 
    myTable 
GROUP BY 
    ParentID 
HAVING 
    COUNT(1) = 1 
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 
+0

查看我的评论。 :)第一行也引用自身,但不应该排除。 – Torben 2009-12-01 08:26:42

相关问题