Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL:如何将同一个表中没有子项的记录分离出来?_Sql_Sql Server_Tsql - Fatal编程技术网

MS SQL:如何将同一个表中没有子项的记录分离出来?

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 | 现在我想让我的观点认

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

|  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。请不要写引用视图的视图!改为写一个存储过程或其他东西。引用视图的视图是性能杀手您不能为引用另一个视图的视图编制索引,应该避免。