Day #3使用SQL Server。
我试图将2列分隔数据组合成一个表值函数的输出。以下是我的数据:
我想处理数据并将其放入以下格式的表中:
我现在正在 * 尝试 * 使用这个CROSS APPLY TSQL语句,但我不知道我在做什么。
USE [Metrics]
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
SELECT d.RawKey, c.*, e.*
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstringcomma(d.DelimitedString) c, dbo.splitstringcomma(d.DelimitedValues) e
我对交叉应用的研究有着广泛的背景,我不明白它应该如何应用在这个场景中。我是否需要一个带有额外CROSS APPLY和join的子查询来合并来自两个表值函数的返回?
下面是我最初使用的split函数(我不记得作者是谁了):
CREATE FUNCTION [dbo].[splitstring] ( @stringToSplit VARCHAR(MAX), @Delimiter CHAR(1))
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(@Delimiter, @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(@Delimiter, @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
编辑修订查询
USE [Metrics]
INSERT INTO dbo.tblSplitData(SplitKey, SplitString, SplitValues)
SELECT s.RawKey, s.SplitString, v.SplitValues
FROM (
SELECT d.RawKey, d.DelimitedString,
c.item SplitString, c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstring(d.DelimitedString, ',') c
) s
INNER JOIN
(
SELECT d.RawKey, d.DelimitedValues,
c.item SplitValues, c.rn
FROM dbo.tblRawData d
CROSS APPLY dbo.splitstring(d.DelimitedValues, ',') c
) v
on s.RawKey = v.RawKey
and s.rn = v.rn;
3条答案
按热度按时间50pmv0ei1#
如果我们能看到你的拆分字符串函数,可能会更容易回答这个问题。我的答案是使用我的split函数的一个版本。
我会在你的拆分函数中包含一个行号,你可以用它来连接拆分的字符串和拆分的值。
分割功能:
然后,如果有多个要拆分的列,则可以使用类似于以下的查询:
查看SQL Fiddle with Demo
它使用两个子查询生成拆分值列表,然后使用split函数创建的行号连接它们。
qrjkbowd2#
因为你是在Sql Server 2008上。你可以使用XML在没有UDF的情况下做到这一点。
以下是SQLFiddle演示
6bc51xsx3#
你可以使用交叉申请多列,如果你把它放在括号和使用“AS”两次。它甚至是别名,以便您可以在查询中进一步使用它们。