我搜索了很多论坛和网站,但却未能找到解决方案。也许我不是在寻找正确的东西 - 但任何方向和帮助都会受到赞赏!
我正在尝试加入两个表:UserData
和ServiceStats
。 UserData
由以下列和示例数据组成:
Title Application
------------ -------------
Site Manager KB1245;KB3256
FTP_Viewer FTP1536
ServiceStats
由以下列和示例数据组成:
ApplicationName Vendor
--------------- ------------
KB1245 Kronos
KB3256 Kronos2
FTP1536 File Manager
加入表时,我需要获得类似于以下内容的输出:
Site Manager KB1245 Kronos
Site Manager KB3256 Kronos2
FTP_Viewer FTP1536 File Manager
我的问题是让联接阅读并识别ApplicationNames
多个Title
。
再次 - 感谢任何帮助和指导。
答案 0 :(得分:0)
我可以削减OP一些松懈。作为开发人员,我们必须处理其他人做出的不太理想的决策。 OP应该搜索的是如何拆分分隔字符串,StackOverflow上有大量字符串。
我的解决方案:
;WITH
cte1 AS (
SELECT Title,
REPLACE(Application,' ','') + ';' AS Application
FROM UserData
),
cte2 AS (
SELECT Title,
LEFT(Application,CHARINDEX(';',Application)-1) AS ApplicationName,
STUFF(Application,1,CHARINDEX(';',Application),'') AS RemainingApp
FROM cte1
UNION ALL
SELECT Title,
LEFT(RemainingApp,CHARINDEX(';',RemainingApp)-1),
STUFF(RemainingApp,1,CHARINDEX(';',RemainingApp),'')
FROM cte2
WHERE LEN(RemainingApp) > 0
)
SELECT c2.Title,
c2.ApplicationName,
s.Vendor
FROM cte2 c2
INNER JOIN ServiceStats s ON c2.ApplicationName = s.ApplicationName
答案 1 :(得分:0)
我更喜欢使用表值函数,它允许我加入它。当我不得不使用它时,这也使我的代码更小:
ALTER FUNCTION [dbo].[Split](@String VARCHAR(8000), @Delimiter CHAR(1))
RETURNS @temptable TABLE (item VARCHAR(8000))
AS
BEGIN
DECLARE @idx INT
DECLARE @slice VARCHAR(8000)
SELECT @idx = 1
IF len(@String)<1 OR @String IS NULL RETURN
while @idx!= 0
BEGIN
SET @idx = charindex(@Delimiter,@String)
IF @idx!=0
SET @slice = LEFT(@String,@idx - 1)
ELSE
SET @slice = @String
IF(len(@slice)>0)
INSERT INTO @temptable(Item) VALUES(@slice)
SET @String = RIGHT(@String,len(@String) - @idx)
IF len(@String) = 0 break
END
RETURN
END
然后使用它:
SELECT * FROM dbo.Split('1;2;3;4;5',';')
它就像一张桌子,所以你甚至可以加入它:
SELECT *
FROM dbo.Split('1;2;3;4;5',';') a
INNER JOIN MyTable b ON a.item = b.Field1