MS SQL:如何将同一个表中没有子项的记录分离出来?
我有一个棘手的问题。我在MS SQL 2005中有一个非常复杂的视图,结果如下:MS SQL:如何将同一个表中没有子项的记录分离出来?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个棘手的问题。我在MS SQL 2005中有一个非常复杂的视图,结果如下: | ID | Name | ParentID | -------------------------------- | 1 | Cars | 1 | | 2 | Audi | 1 | | 3 | Toyota | 1 | | 4 | Trucks | 4 | 现在我想让我的观点认
| ID | Name | ParentID |
--------------------------------
| 1 | Cars | 1 |
| 2 | Audi | 1 |
| 3 | Toyota | 1 |
| 4 | Trucks | 4 |
现在我想让我的观点认识到ID为4的记录没有子项,并因此将其分离出来
有什么想法吗
谢谢
Torben由于父行的ParentID=ID,因此您希望查找只有一个给定ParentID实例的行:
SELECT
ParentID
FROM
myTable
GROUP BY
ParentID
HAVING
COUNT(1) = 1
由于父行的ParentID=ID,因此您希望查找只有一个给定ParentID实例的行:
SELECT
ParentID
FROM
myTable
GROUP BY
ParentID
HAVING
COUNT(1) = 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也没有孩子。这些可能是没有孩子的:
SELECT a.*
FROM theView a
LEFT JOIN theView b ON (a.a = b.ParentId AND b.Id <> b.ParentId)
WHERE b.Id IS NULL
SELECT *
FROM Table as parent
WHERE EXISTS (
SELECT child.ParentID
FROM Table as child
WHERE parent.ParentId = child.id
and parent.id != child.id
)
然而,ID 2和ID 3也没有孩子
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
如果没有父对象的行引用自身,则很容易:
SELECT *
FROM Table as parent
WHERE parent.parentId != parent.id
这一行没有父行,它们是否总是引用自身?是的,它们是。但问题是,第一行总是引用自己。这只是一个有两个级别的基本示例,也可以有四个或五个级别。这一行没有父级,它们总是引用自己吗?是的,它们是。但问题是,第一行总是引用自己。这只是一个有两个级别的基本示例,也可以有四个或五个级别。请参阅我的评论:第一行也引用自身,但不应进行排序。请参阅我的注释:第一行也引用了自身,但不应该进行排序。我明白了。。。解决这个问题的唯一方法是一个新的视图,它将第一个视图与自身结合起来。谢谢。托本H。请不要写引用视图的视图!改为写一个存储过程或其他东西。引用视图的视图是性能杀手您不能为引用另一个视图的视图编制索引,应该避免。我明白了。。。解决这个问题的唯一方法是一个新的视图,它将第一个视图与自身结合起来。谢谢。托本H。请不要写引用视图的视图!改为写一个存储过程或其他东西。引用视图的视图是性能杀手您不能为引用另一个视图的视图编制索引,应该避免。