2015-06-24 3 views
6

Возможно ли добавить дополнительные строки к выбранному набору на основе значения поля?sql добавление дополнительных строк в каждую строку

У меня есть этот запрос:

WITH CTEDivisions AS 
(
    SELECT .... 
) 

SELECT 
    cnt, 
    Division 
FROM CTEDivisions 

который возвращает:

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

Что мне нужно, это утверждение, что возвращает 3 дополнительные строки, когда cnt = 2, как:

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 мы искали способы сделать это и нашли некоторые возможные решения, используя cursor и WHILE, но они, похоже, не работают вместе с оператором CTE.

ответ

4

Составьте таблицу для дополнительных строк (или как КТР, или в качестве постоянной таблицы) и оставил присоединиться к нему с помощью условия (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 
; 

результирующего набора

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

Красивая, спасибо! – russds

+0

Добро пожаловать. Ответ @Giorgi Nakeuri дает почти идентичный план выполнения. 'OUTER APPLY' в этом случае работает как' 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

Хотя я не пробовал этот, он выглядит хорошо, спасибо! – russds