2015-06-24 15 views
6

È possibile aggiungere righe aggiuntive a un set selezionato in base a un valore di campo?sql aggiungendo righe aggiuntive a ciascuna riga

ho questa query:

WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    cnt, 
    Division 
FROM CTEDivisions 

che restituisce:

cnt   Division 
    1   Sales 
    2   Marketing 
    1   Business 
    2   IT 
    etc... 

cosa ho bisogno è una dichiarazione che restituisce 3 righe aggiuntive quando cnt = 2, come:

Division  NewDivision 
Sales  Sales 
Marketing Marketing - X 
Marketing Marketing - Y 
Marketing Marketing - Z 
Business  Business 
IT   IT - X 
IT   IT - Y 
IT   IT - Z 
etc... 

I Ho cercato modi per farlo e ho trovato alcune soluzioni possibili usando uno cursor e ciclo WHILE, ma quelli non sembrano funzionare in congiunzione con la dichiarazione CTE.

risposta

4

Fai un tavolo per le righe in più (sia come CTE, o come un tavolo permanente) e LEFT JOIN ad esso utilizzando la sua condizione (cnt=2):

DECLARE @T TABLE(cnt int, Division varchar(100)); 
INSERT INTO @T(cnt, Division) VALUES 
(1, 'Sales'), 
(2, 'Marketing'), 
(1, 'Business'), 
(2, 'IT'); 

WITH 
CTEDivisions 
AS 
(
    SELECT 
     cnt 
     ,Division 
    FROM @T 
) 
,CTE_Extra 
AS 
(
    SELECT ' - X' AS Extra 
    UNION ALL 
    SELECT ' - Y' AS Extra 
    UNION ALL 
    SELECT ' - Z' AS Extra 
) 
SELECT 
    cnt 
    ,Division 
    ,Division + ISNULL(Extra, '') AS NewDivision 
FROM 
    CTEDivisions 
    LEFT JOIN CTE_Extra ON CTEDivisions.cnt = 2 
; 

set di risultati

cnt Division NewDivision 
1  Sales  Sales 
2  Marketing Marketing - X 
2  Marketing Marketing - Y 
2  Marketing Marketing - Z 
1  Business Business 
2  IT   IT - X 
2  IT   IT - Y 
2  IT   IT - Z 
+0

Bello, grazie! – russds

+0

Prego. Risposta di @Giorgi Nakeuri produce un piano di esecuzione quasi identico. 'ESTER APPLICY' in questo caso funziona come' LEFT JOIN'. –

4
WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    c.cnt, 
    c.Division, 
    c.Division + ISNULL(' - ' + o.v, '') AS NewDivision 
FROM CTEDivisions c 
OUTER APPLY(SELECT v FROM(VALUES('X'),('Y'),('Z'))t(v) WHERE c.cnt = 2)o 
+0

Anche se non ho provato questo, sembra buono grazie! – russds

Problemi correlati