我有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
答案 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
答案 1 :(得分:0)
我创建了另一个CTE,它从4个cte中提取最大记录,并生成RowNumber 1到N(4个CTE中的最大记录数),并使用LEFT JOIN将所有4个CTE与之连接。 这是我修改查询以实现结果的方法;
__init__