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
Sql server 无法理解如何与…诱惑是获取一个额外的行_Sql Server - Fatal编程技术网

Sql server 无法理解如何与…诱惑是获取一个额外的行

Sql server 无法理解如何与…诱惑是获取一个额外的行,sql-server,Sql Server,我有一个名为Property的表,它有两列PropertyRSN和ParentPropertyRSN 数据 propertyRSN | parentpropertyRSN 19 | 3 18 | 6 27 | 7 12 | 9 13 | 9 16 | 12 WITH tempTable(PLRSN, PRSN) AS ( SELECT PropertyRSN, Property.P

我有一个名为
Property
的表,它有两列
PropertyRSN
ParentPropertyRSN

数据

propertyRSN | parentpropertyRSN
19          | 3
18          | 6
27          | 7
12          | 9
13          | 9
16          | 12

WITH tempTable(PLRSN, PRSN) AS (
   SELECT PropertyRSN, Property.ParentPropertyRSN 
   FROM Property 
   WHERE PropertyRSN = 16
   UNION ALL
   SELECT nplus1.PropertyRSN, nplus1.ParentPropertyRSN 
   FROM Property as nplus1, tempTable 
   WHERE tempTable.prsn = nplus1.PropertyRSN
)
SELECT PLRSN, PRSN 
FROM tempTable
结果

PLRSN | PRSN
16    | 12
12    | 9
9     | NULL
问题-我无法理解temTable查询如何获取数据为
9 | NULL
的行? 此外,我无法理解如何在括号内使用TemTable

=====================================================================

create table property (propertyRSN int, ParentPropertyRSN int);
Insert into property (propertyRSN, ParentPropertyRSN) values (19,3);
Insert into property (propertyRSN, ParentPropertyRSN) values (18,6);
Insert into property (propertyRSN, ParentPropertyRSN) values (27,7);
Insert into property (propertyRSN, ParentPropertyRSN) values (12,9);
Insert into property (propertyRSN, ParentPropertyRSN) values (13,9);
Insert into property (propertyRSN, ParentPropertyRSN) values (16,12);
您的CTE恰好是一个递归CTE,我会选择使用显式联接编写:

WITH tempTable (PLRSN, PRSN) AS (
    SELECT PropertyRSN, Property.ParentPropertyRSN
    FROM Property
    WHERE PropertyRSN = 16

    UNION ALL

    SELECT nplus1.PropertyRSN, nplus1.ParentPropertyRSN
    FROM Property AS nplus1
    INNER JOIN tempTable t ON t.prsn = nplus1.PropertyRSN
)

SELECT PLRSN, PRSN FROM tempTable;

PLRSN=16
的第一行来自递归CTE的基本情况,它出现在
UNION ALL
之前。接下来的两行来自两个递归步骤。虽然在上一次迭代中,来自
可诱惑的
PRSN
值不是
NULL
(实际上是9),但该记录的父记录确实有
NULL
值用于
PRSN
。这就是为什么递归会在那一点停止,因为父项已被命中。

谢谢@Tim我现在明白了-第一行来自
属性表-第二行来自union all查询的第二个查询,其中
PRSN=12
-第三行来自union all查询的第二个查询,其中
PRSN=9
sinc
9
没有值对于
ParentPropertyRSN
,我们看到
NULL