SQL如何在列与行中连接多个选择

SQL如何在列与行中连接多个选择,sql,sql-server,Sql,Sql Server,我有以下SQL Server查询: 结果如下: 我需要的是data1是第一列,data2是第二列,data3是第三列。我将始终为每个数据选择相同数量的记录 有线索吗?谢谢 你想要的不是工会: 从字符串_SPLIT@data1,,'中选择*作为data1, 字符串_SPLIT@data2,','作为data2, 字符串_拆分@data3,,'作为data3 SQL Server不保证字符串分割结果的顺序。唉,唉 因此,我建议使用递归CTE: with cte as ( select c

我有以下SQL Server查询:

结果如下:

我需要的是data1是第一列,data2是第二列,data3是第三列。我将始终为每个数据选择相同数量的记录

有线索吗?谢谢

你想要的不是工会:

从字符串_SPLIT@data1,,'中选择*作为data1, 字符串_SPLIT@data2,','作为data2, 字符串_拆分@data3,,'作为data3
SQL Server不保证字符串分割结果的顺序。唉,唉

因此,我建议使用递归CTE:

with cte as (
      select convert(nvarchar(max), null) as str, convert(nvarchar(max), v.rest) as rest, v.which, 0 as lev
      from (values (@data1, 1), (@data2, 2), (@data3, 3)) v(rest, which)
      union all
      select convert(nvarchar(max), left(rest, charindex(',', rest + ',') - 1)),
             convert(nvarchar(max), stuff(rest, 1, charindex(',', rest + ','), '')) as rest,
             which, lev + 1
      from cte
      where rest <> ''
     )
select max(case when which = 1 then str end) as str1,
       max(case when which = 2 then str end) as str2,
       max(case when which = 3 then str end) as str3
from cte
where lev > 0
group by lev;
他是一把小提琴


未来,他们将有望添加其他数据库中可用的带偏移量/带序数选项。

另一种可能的解决方案:

DECLARE @data1 nvarchar(500) = '0.2,0.3,0.4'
DECLARE @data2 nvarchar(500) = '0.6,0.7,0.8'
DECLARE @data3 nvarchar(500) = '0.3,0.5,0.5'

;with cte1(data, rn) as
(
select value, row_number() over(order by (select null)) as rn
from STRING_SPLIT(@data1, ',')
),
cte2(data, rn) as
(
select value, row_number() over(order by (select null)) as rn
from STRING_SPLIT(@data2, ',')
),
cte3(data, rn) as
(
select value, row_number() over(order by (select null)) as rn
from STRING_SPLIT(@data3, ',')
)
select t1.data as Data1, t2.data as Data2, t3.data as Data3
from cte1 t1
join cte2 t2 on t2.rn = t1.rn
join cte3 t3 on t3.rn = t1.rn
联合确实不是你所需要的。我猜交叉连接也不是您所需要的,因为它生成所有3个数据集的笛卡尔积,在这里生成3^3=27条记录

你确实需要某种形式的加入。但是,我们在使用STRING_SPLIT时必须小心,因为它基本上返回无序记录,如中所述:

输出行可以是任意顺序。顺序不能保证与输入字符串中子字符串的顺序匹配

下面是一个解决方案,它按值对每个记录集排序,然后按行号合并结果。因此,您只能获得3条记录,我相信这是您想要的,并且具有可预测的顺序:

SELECT x1.value, x2.value, x3.value
FROM 
    (
        SELECT value, ROW_NUMBER() OVER(ORDER BY value) rn FROM STRING_SPLIT ( @data1, ',' )
    ) x1
    INNER JOIN (
        SELECT value, ROW_NUMBER() OVER(ORDER BY value) rn FROM STRING_SPLIT ( @data2, ',' )
    ) x2 ON x2.rn = x1.rn
    INNER JOIN (
        SELECT value, ROW_NUMBER() OVER(ORDER BY value) rn FROM STRING_SPLIT ( @data2, ',' )
    ) x3 ON x3.rn = x1.rn
这与您的示例数据一起返回:

value | value | value
:---- | :---- | :----
0.2   | 0.6   | 0.6  
0.3   | 0.7   | 0.7  
0.4   | 0.8   | 0.8 

非常感谢戈登
value | value | value
:---- | :---- | :----
0.2   | 0.6   | 0.6  
0.3   | 0.7   | 0.7  
0.4   | 0.8   | 0.8