СОЮЗ на разных CTE - PullRequest
       15

СОЮЗ на разных CTE

1 голос
/ 29 февраля 2020

Возможно ли объединить два отдельных 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

Я хочу разные значения [data] из каждого CTE вместе с их суммой в одной записи. Не удается разместить UNION между CTE (SQL Server 2014 Developer). Есть ли действительный SQL, который может выводить оба CTE как часть одного (в данном случае двухстрочного) набора записей?

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Я должен был быть яснее, что моя первоначальная задача состояла в том, чтобы взять некоторое количество пар запросов (1 пара в моем примере, каждая из которых создает одну точку данных), объединить их в отдельные записи и затем добавить третье поле, которое выполняет некоторые математические операции. на двух полях данных. Оттуда мне нужно было объединить записи данных / математические данные в один набор результатов. Использование 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
0 голосов
/ 29 февраля 2020

Почему бы просто не превратить 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, а затем использовать их в объединении. Это означает, что вы не можете использовать один и тот же псевдоним 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
...