Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql向每行添加其他行_Sql_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

sql向每行添加其他行

sql向每行添加其他行,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,是否可以根据字段值向选定集添加其他行 我有一个疑问: WITH CTEDivisions AS ( SELECT .... ) SELECT cnt, Division FROM CTEDivisions 返回: cnt Division 1 Sales 2 Marketing 1 Business 2 IT etc... 我需要的是一个语句,它

是否可以根据字段值向选定集添加其他行

我有一个疑问:

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

我已经找到了实现这一点的方法,并使用
游标
WHILE
循环找到了一些可能的解决方案,但这些方法似乎不能与
CTE
语句结合使用。

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