0

我有一个Staging包含以下列的表格

  • 视频网址
  • 评分
  • 长度
  • 缩略图
  • 标签(逗号分隔)

视频与标签有多对多的关系。我创建了以下新表:

  • 视频
  • 标签
  • 视频标签

如何将 Staging 表中的数据解析成三个新表?Tag 表不应包含重复项。此外,在将数据插入新表之前,我需要对数据进行一些格式化,例如需要从 Length 列中删除所有字母。

4

3 回答 3

1

我会怎么做。

  1. 使用此问题 将 CSV 列解析为多行,另一个表使用人工键将旧表链接到新表
  2. 将两个表与另一个生成的人工键(Many many join table primary key)列连接以创建多对多表
  3. 修复多对多关系的两端
于 2012-09-02T02:22:24.237 回答
1

使用辅助数字表,您可以将标签列拆分为行,同时保持与 VideoURL 的关联:

CREATE TABLE NumberPivot (NumberID INT PRIMARY KEY)
DECLARE @intLoopCounter INT
SELECT @intLoopCounter =0
SET NOCOUNT ON

WHILE @intLoopCounter <=999 BEGIN
   INSERT INTO NumberPivot
   VALUES (@intLoopCounter)
   SELECT @intLoopCounter = @intLoopCounter +1
END
GO


SELECT
  ContentPageID,
  Substring(',' + Tags + ','
            , numberID + 1
            , Charindex(',', ',' + Tags + ',', numberID + 1) - numberid - 1) AS value 
FROM   dbo.NumberPivot  AS np,
       Staging AS S
WHERE  numberid <= Len(',' + Tags + ',') - 1
   AND Substring(',' + Tags + ',', numberID, 1) = ',' 

所以在这里我们用唯一的标签填充标签表:

;WITH X AS (
SELECT
  VideoURL,
  Substring(',' + Tags + ',', numberID + 1, Charindex(',', ',' + Tags + ',', numberID + 1) - numberid - 1) AS Tag
FROM   dbo.NumberPivot  AS np,
       Staging AS S
WHERE  numberid                                      <= Len(',' + Tags + ',') - 1
   AND Substring(',' + Tags + ',', numberID, 1) = ',' 
)
INSERT Tag (Tag)
SELECT DISTINCT Tag FROM X;

接下来填写视频表:

INSERT Video (VideoURL, Rating, Length, Thumbnail)
SELECT VideoURL, Rating, Length, Thumbnail
FROM Staging;

最后填写VideoTag:

INSERT VideoTag (VideoURL, Tag)
SELECT
  VideoURL,
  Substring(',' + Tags + ',', numberID + 1, Charindex(',', ',' + Tags + ',', numberID + 1) - numberid - 1) AS Tag
FROM   dbo.NumberPivot  AS np,
       Staging AS S
WHERE  numberid                                      <= Len(',' + Tags + ',') - 1
   AND Substring(',' + Tags + ',', numberID, 1) = ',' 

从这里使用数字表获取拆分字符串

于 2012-09-02T02:44:18.107 回答
1

试试这个,假设 videourl 作为视频名称和splitstring 函数返回表有标记名列

create table video(...)
create table tag(...)
create table videotag(...)


insert video
select distinct(maintable.videourl) as videoname
from   maintable 


insert tag
select distinct(tag.tagname)
from   maintable cross apply SplitString(maintable.tags,',') tag

insert videotag
select maintable.videourl as videoname,tag.tagname
from   maintable   cross apply SplitString(maintable.tags,',') tag

如果您从 video 和 tag 表中自动生成 id,那么
在插入 videotag 表时会从
它的主表中获取关联的自动生成的 id。

Splitstring 函数来自这里

于 2012-09-02T02:57:53.833 回答