Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
SQL递归CTE查询错误';列名无效-级别为';_Sql_Sql Server 2005_Common Table Expression - Fatal编程技术网

SQL递归CTE查询错误';列名无效-级别为';

SQL递归CTE查询错误';列名无效-级别为';,sql,sql-server-2005,common-table-expression,Sql,Sql Server 2005,Common Table Expression,尝试编写递归CTE查询时,不断出现以下错误:level,列名无效 这就是问题所在,我错在哪里 WITH OwnerHierarchy AS ( SELECT PairID, ChildID, ParentID, 0 AS level FROM BusinessHierarchy UNION ALL SELECT e.PairID, e.ChildID, e.P

尝试编写递归CTE查询时,不断出现以下错误:
level,列名无效

这就是问题所在,我错在哪里

WITH OwnerHierarchy AS (
   SELECT PairID, 
          ChildID, 
          ParentID, 
          0 AS level
     FROM BusinessHierarchy
   UNION ALL
   SELECT e.PairID, 
          e.ChildID, 
          e.ParentID, 
          level + 1 AS level
     FROM BusinessHierarchy AS e 
     JOIN BusinessHierarchy AS eh ON e.ParentID = eh.ParentID)
 SELECT PairID, 
        ChildID, 
        ParentID, 
        level
    FROM OwnerHierarchy AS OwnerHierarchy_1
 ORDER BY level, ChildID, ParentID

这是ms sql server 2005。

您需要在CTE的下半部分的某个地方进行递归。相反,您有两次
BusinessHierarchy

只是猜测确切的需求,但类似于此

WITH OwnerHierarchy(PairID, ChildID, ParentID, level)
AS 
(
     SELECT PairID, ChildID, ParentID, 0 AS level
     FROM BusinessHierarchy
     WHERE ParentID IS NULL
     UNION ALL
     SELECT e.PairID, e.ChildID, e.ParentID, level + 1 AS level
     FROM BusinessHierarchy AS e 
     INNER JOIN OwnerHierarchy AS eh 
     ON e.ParentID = eh. ChildID
     )
 SELECT     PairID, ChildID, ParentID, level
 FROM         OwnerHierarchy AS OwnerHierarchy_1
 ORDER BY level, ChildID, ParentID

您发布的内容有三个问题:

WITH OwnerHierarchy AS (
   SELECT a.pairid, 
          a.childid, 
          a.parentid, 
          0 AS level
     FROM BusinessHierarchy a
    WHERE a.parentid IS NULL -- Point #1, see below
   UNION ALL
   SELECT b.PairID, 
          b.ChildID, 
          b.ParentID, 
          oh.level + 1 AS level
     FROM BusinessHierarchy AS b
     JOIN OwnerHierarchy oh ON oh.childid = b.parentid) -- Points #2 & 3, see below
 SELECT x.PairID, 
        x.ChildID, 
        x.ParentID, 
        x.level
    FROM OwnerHierarchy x
 ORDER BY x.level, x.ChildID, x.ParentID
要点:

  • 联合的上半部分缺少确定根节点/记录/行的内容。我假设,希望是正确的
  • 当引用应为CTE名称时,您正在将
    BusinessHierarchy
    加入自身
  • CTE和原始表格之间的关系必须正确,并且方向正确
  • 使用表别名的道具,但它们的使用并不一致,它们应该尽可能简短。在定义它们时,不需要将
    用作
    ,只是该部分的风格问题

    结论

    我认为表别名将处理
    级别
    列未找到的问题,但不是100%。

    我尝试了几种不同的方法,要么没有结果(数据库中有几个测试用例),要么visual studio崩溃!好的,请注意,我们有两个不同版本的MS SQL,测试环境当然不支持公共表!然而,它没有返回任何数据集,这很奇怪,因为我知道至少有几个测试用例应该返回!我错过了一些东西,因为我没有得到任何结果。如果我运行查询的第一部分,除非删除:WHERE a.parentid为NULL行,否则什么也得不到,但是当我运行整个查询时删除了这一行,那么我的IDE就会崩溃。老实说,我不是真的了解所有的CTE方面,但我想它是越来越好,我看得越多。谢谢,我发现了错误是什么,太棒了。这帮了大忙,所以谢谢。我投了票,我确信:)谢谢。很抱歉,我之前没有回复,有医生的事情要处理,但很高兴看到你能解决。