我在sql server表中有一个列p_author
,名为sub_aminer_paper
,包含单个或多个作者的值,数据类型text
由分号分隔,;
现在,我必须将相应的ID分配给此列值,即p_author
,其中这些作者的id' s存储在sub_aminer_author
列中另一个名为aid
的表中。
两个表的视图都附在图像上
表sub_aminer_author
表sub_aminer_paper
我在aid
表和name
表中的sub_aminer_author
列中突出显示了p_author
和sub_aminer_paper
列。
现在,我必须在p_authors_id
表中添加一个名为sub_aminer_paper
的新列,并在aid
表中填入相应的sub_aminer_author
。
我正在为两个表(仅关注列数据)附加csv格式的样本数据
以下是csv文件的链接
https://drive.google.com/file/d/0B6ihKgOLimL0MUhHZFlpLThTZzA/view?usp=sharing
https://drive.google.com/file/d/0B6ihKgOLimL0MUhHZFlpLThTZzA/view?usp=sharing
对于表创建,这里是代码 -
CREATE TABLE [dbo].[sub_aminer_paper](
[pid] [int] NULL,
[p_author] [varchar](max) NULL)
CREATE TABLE [dbo].[sub_aminer_author](
[aid] [int] NULL,
[name] [varchar](max) NULL)
请提前帮助和谢谢!
答案 0 :(得分:0)
这将拆分分号;
分隔值,然后将其连接到Authors表以从authors表中获取AID。
- 向sub_aminer_paper表添加新列
ALTER TABLE sub_aminer_paper
ADD AID VARCHAR(100)
GO
- 更新声明
WITH X AS
(
SELECT *
FROM
(
SELECT PID
,Split.a.value('.', 'VARCHAR(100)') p_Author
FROM
(SELECT PID
,Cast ('<X>' + Replace(p_Author, ';', '</X><X>') + '</X>' AS XML) AS Data
FROM sub_aminer_paper
) AS t CROSS APPLY Data.nodes ('/X') AS Split(a)
) t
INNER JOIN sub_aminer_author t1 ON t.p_Author = t1.Name
), Y AS
(
SELECT *
,STUFF((SELECT ';' + CAST(AID AS VARCHAR(20))
FROM X
WHERE X.pid = Y.pid
FOR XML PATH(''),TYPE)
.value('.','NVARCHAR(MAX)'),1,1,'') NewAID
FROM X AS Y
)
UPDATE t
SET AID = Y.NewAID
FROM sub_aminer_paper t
INNER JOIN Y ON Y.pid = t.pid
重要提示
帮助自己并规范化您的数据,如果您的数据已标准化,此查询可能会更加简单。我曾尝试在猪身上涂上口红,但它仍然是猪。