我需要根据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能够为我提供一个好的解决方案。
谢谢!
答案 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分割字符串。