【问题标题】:sql adding additional rows to each rowsql向每一行添加额外的行
【发布时间】:2015-06-24 04:08:10
【问题描述】:

是否可以根据字段值向选定的集合添加额外的行?

我有这个问题:

WITH CTEDivisions AS
(
    SELECT ....
)

SELECT 
    cnt,
    Division
FROM CTEDivisions

返回:

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

我需要的是一个语句,当cnt = 2 时返回 3 个额外的行,例如:

 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...

我已经搜索了执行此操作的方法,并找到了一些使用 cursorWHILE 循环的可能解决方案,但这些似乎无法与 CTE 语句一起使用。

【问题讨论】:

    标签: sql sql-server tsql sql-server-2012


    【解决方案1】:

    为您的额外行创建一个表(作为 CTE,或作为永久表)并使用您的条件 (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
    

    【讨论】:

    • 不客气。 @Giorgi Nakeuri 的回答产生了几乎相同的执行计划。 OUTER APPLY 在这种情况下的工作方式类似于 LEFT JOIN
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-02
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多