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