SQL Server加入多个CTE

时间:2019-05-18 00:34:55

标签: sql-server

我有4个通用表表达式,每个表达式包含2列  (行号,帐户号),但每个CTE中包含变量记录,具体取决于查询参数。目的是在加入后将每个CTE的所有非空帐号都保留在顶部。

我正在基于RowNumber使用FULL Join加入4个CTE。我遇到的问题是AccountNumber的序列不连续,即在某些情况下在AccountNumber之间包含一些空值。我想让所有非null值始终组合在一起,并在顶部保留null。每个CTE中的AccountNumber的数量总是不同的。

SELECT​
  ISNULL(Cte_FirstYear.AccountNumber,'') as FirstYear,​
  ISNULL(Cte_SecondYear.AccountNumber,'') as SecondYear,​
  ISNULL(cte_ThirdYear.AccountNumber,'') as ThirdYear,​
  ISNULL(cte_FourthYear.AccountNumber,'') as FourthYear​
FROM cte_ThirdYear​
FULL OUTER JOIN​
cte_FirstYear
on ​
cte_ThirdYear.RowNumber=cte_FirstYear.RowNumber​​
full outer join  Cte_SecondYear​
on ​
cte_ThirdYear.RowNumber=Cte_SecondYear.RowNumber​​
full outer join  cte_FourthYear​
on ​
cte_ThirdYear.RowNumber=cte_FourthYear.RowNumber​​

这是我获取输出的方式;

FirstYear SecondYear ThirdYear FourthYear
1           2           3         4
5           6           7         1
            9          NULL      NULL
                       NULL
                        9         9
                        10       NULL            

此处为预期输出;

FirstYear SecondYear ThirdYear FourthYear
1           2           3         4
5           6           7         1
            9           9         9
                        10

2 个答案:

答案 0 :(得分:1)

根据link中的@Donnie的解释

  

交叉联接会在两个表之间产生笛卡尔积,并返回所有行的所有可能组合。它没有on子句,因为您只是将所有内容连接到所有内容。

     

完全外部联接是左外部联接和右外部联接的组合。它返回两个表中与查询的where子句匹配的所有行,并且在无法满足这些行的打开条件的情况下,它将为未填充的字段放入空值。

您可以添加此行以忽略:
on cte_ThirdYear.RowNumber=cte_FirstYear.RowNumber​​ and on ​ cte_ThirdYear.RowNumber is not null and cte_FirstYear.RowNumber​​ is not null

阅读此pdf文件:http://stevestedman.com/wp-content/uploads/TSqlJoinTypePoster1.pdf

enter image description here

答案 1 :(得分:0)

我创建了另一个CTE,它从4个cte中提取最大记录,并生成RowNumber 1到N(4个CTE中的最大记录数),并使用LEFT JOIN将所有4个CTE与之连接。 这是我修改查询以实现结果的方法;

__init__