不同 CTE 上的 UNION
UNION on Different CTEs
是否可以联合两个独立的 CTE?假设我有以下 2 个查询集:
;WITH [fu] AS (SELECT 1 AS [data]),
[bar] AS (SELECT 5 AS [data])
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu] a JOIN [bar] b ON 1=1
;WITH [fu] AS (SELECT 3 AS [data]),
[bar] AS (SELECT 8 AS [data])
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu] a JOIN [bar] b ON 1=1
我想要每个 CTE 的不同 [data] 值以及它们在同一记录中的总和。在 CTE 之间放置 UNION 失败(SQL Server 2014 Developer)。是否有有效的 SQL 可以将两个 CTE 作为同一(在本例中为 2 行)记录集的一部分输出?
为什么不简单地将 CTE 转换为子查询?
SELECT ... -- your final logic goes here
FROM (
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM (SELECT 1 AS [data]) a
JOIN (SELECT 5 AS [data]) b ON 1=1
UNION ALL
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM (SELECT 3 AS [data]) a
JOIN (SELECT 8 AS [data]) b ON 1=1
) t
否则需要先声明所有的CTE,然后在union中使用。这意味着您不能为两个不同的查询重复使用相同的 CTE 别名两次,因此:
WITH
[fu1] AS (SELECT 1 AS [data]),
[bar1] AS (SELECT 5 AS [data]),
[fu2] AS (SELECT 3 AS [data]),
[bar2] AS (SELECT 8 AS [data])
SELECT ... -- your final logic goes here
FROM (
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM [fu1] a
JOIN [bar1] b ON 1=1
UNION ALL
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM [fu2] a
JOIN [bar2] b ON 1=1
) t
我应该更清楚一点,我最初的挑战是获取一些查询对(在我的示例中为 1 对,每个查询对生成一个数据点),将它们组合成单个记录,然后添加第三个字段关于这两个数据字段的一些数学运算。从那里我需要将单条记录 data/math 记录联合到一个结果集中。使用 CTE 绝对是正确的轨道,但感谢 HABO 的想法,它给了我我需要的 SQL..
;WITH [fu_1] AS (SELECT 1 AS [data]),
[bar_1] AS (SELECT 5 AS [data]),
[fu_2] AS (SELECT 3 AS [data]),
[bar_2] AS (SELECT 8 AS [data])
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu_1] a JOIN [bar_1] b ON 1=1
UNION
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu_2] a JOIN [bar_2] b ON 1=1
是否可以联合两个独立的 CTE?假设我有以下 2 个查询集:
;WITH [fu] AS (SELECT 1 AS [data]),
[bar] AS (SELECT 5 AS [data])
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu] a JOIN [bar] b ON 1=1
;WITH [fu] AS (SELECT 3 AS [data]),
[bar] AS (SELECT 8 AS [data])
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu] a JOIN [bar] b ON 1=1
我想要每个 CTE 的不同 [data] 值以及它们在同一记录中的总和。在 CTE 之间放置 UNION 失败(SQL Server 2014 Developer)。是否有有效的 SQL 可以将两个 CTE 作为同一(在本例中为 2 行)记录集的一部分输出?
为什么不简单地将 CTE 转换为子查询?
SELECT ... -- your final logic goes here
FROM (
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM (SELECT 1 AS [data]) a
JOIN (SELECT 5 AS [data]) b ON 1=1
UNION ALL
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM (SELECT 3 AS [data]) a
JOIN (SELECT 8 AS [data]) b ON 1=1
) t
否则需要先声明所有的CTE,然后在union中使用。这意味着您不能为两个不同的查询重复使用相同的 CTE 别名两次,因此:
WITH
[fu1] AS (SELECT 1 AS [data]),
[bar1] AS (SELECT 5 AS [data]),
[fu2] AS (SELECT 3 AS [data]),
[bar2] AS (SELECT 8 AS [data])
SELECT ... -- your final logic goes here
FROM (
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM [fu1] a
JOIN [bar1] b ON 1=1
UNION ALL
SELECT
a.[data] AS [Val1],
b.[data] AS [Val2],
(a.[data] + b.[data]) AS [Math]
FROM [fu2] a
JOIN [bar2] b ON 1=1
) t
我应该更清楚一点,我最初的挑战是获取一些查询对(在我的示例中为 1 对,每个查询对生成一个数据点),将它们组合成单个记录,然后添加第三个字段关于这两个数据字段的一些数学运算。从那里我需要将单条记录 data/math 记录联合到一个结果集中。使用 CTE 绝对是正确的轨道,但感谢 HABO 的想法,它给了我我需要的 SQL..
;WITH [fu_1] AS (SELECT 1 AS [data]),
[bar_1] AS (SELECT 5 AS [data]),
[fu_2] AS (SELECT 3 AS [data]),
[bar_2] AS (SELECT 8 AS [data])
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu_1] a JOIN [bar_1] b ON 1=1
UNION
SELECT a.[data] AS [Val1], b.[data] AS [Val2], (a.[data] + b.[data]) AS [Math]
FROM [fu_2] a JOIN [bar_2] b ON 1=1