在SQL中创建逗号分隔列表的关联

时间:2014-02-20 21:10:20

标签: sql sql-server sql-server-2008 many-to-many

我需要根据Person和Language插入一些数据库关联(MS-SQL Server 2008中的多对多表)。我的传入数据包括一个满是人的表格,一个充满语言的表格,人们有一个逗号分隔语言字段,代表他们与之相关的每种语言。

所以这是表格的样子

-----------------------------------------------
ID | First Name  | Last Name | Languages
-----------------------------------------------
1  | Paul        | Johnson   | English,Spanish
2  | Jack        | Johnson   | English,Hindi
3  | Mark        | Johnson   | NULL
-----------------------------------------------

语言

--------------
ID | Name  
--------------
1  | English  
2  | Spanish 
3  | Hindi
--------------    

我需要把它放到一个表中,在完成时,它会像这样:

PeopleLanguage

----------------------
PeopleID | LanguageID
----------------------
1        | 1
1        | 2
2        | 1
2        | 3

现在,我喜欢以避免使用游标或while循环迭代每个医生,并执行操作,但我想不出一种方法可以实现(也是,我不完全理解游标:p)

希望SO能够为我提供一个好的解决方案。

谢谢!

2 个答案:

答案 0 :(得分:-1)

假设上面的结构,我可以通过像这样加入charindex检查来实现这一点:

INSERT INTO PeopleLanguages (PeopleID, LanguageID)
SELECT P.Id, L.Id
FROM People P
JOIN Language L ON  CHARINDEX(L.Name, P.Languages) > 0

答案 1 :(得分:-1)

哎哟......几秒钟......检查SQL Fiddle上的以下工作代码。类似于drothe提出的那个。

Wrond code deleted

你也可以从this other asnwer开始使用,并尝试使用CTE。

根据Aaron Bertrand的评论SQL Fiddle进行检查...在我这边不正确,需要包含更多测试并检查CHARINDEX是否破裂。

尝试此解决方案(working code on SQL Fiddle

SELECT tbl.personID,l.LangID
FROM LANG l JOIN
(SELECT P.[PersonID],
       LTRIM(RTRIM(n.r.value('.', 'varchar(500)'))) [Language]
FROM   People  AS P
       CROSS APPLY (
        SELECT CAST('<A>' + REPLACE([Languages], ',', '</A><A>') + '</A>' AS XML)
        )          AS S(XMLCol)
       CROSS APPLY S.XMLCol.nodes('/A') AS n(r)) tbl ON l.Name = tbl.[Language]

这个SO question及其几个答案为您提供了不同的方法,包括使用的方法。

这里有long and detailed performance analysis如何使用CLR分割字符串。