如何在同一列Sql Server中拆分/替换不同的值

时间:2015-09-03 12:56:08

标签: sql-server text calculated-columns

我在sql server表中有一个列p_author,名为sub_aminer_paper,包含单个或多个作者的值,数据类型text由分号分隔,;
现在,我必须将相应的ID分配给此列值,即p_author,其中这些作者的id' s存储在sub_aminer_author列中另一个名为aid的表中。
两个表的视图都附在图像上 表sub_aminer_author

enter image description here

sub_aminer_paper

enter image description here

我在aid表和name表中的sub_aminer_author列中突出显示了p_authorsub_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)

请提前帮助和谢谢!

1 个答案:

答案 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

重要提示

帮助自己并规范化您的数据,如果您的数据已标准化,此查询可能会更加简单。我曾尝试在猪身上涂上口红,但它仍然是猪。