我有一个Staging
包含以下列的表格
- 视频网址
- 评分
- 长度
- 缩略图
- 标签(逗号分隔)
视频与标签有多对多的关系。我创建了以下新表:
- 视频
- 标签
- 视频标签
如何将 Staging 表中的数据解析成三个新表?Tag 表不应包含重复项。此外,在将数据插入新表之前,我需要对数据进行一些格式化,例如需要从 Length 列中删除所有字母。
我有一个Staging
包含以下列的表格
视频与标签有多对多的关系。我创建了以下新表:
如何将 Staging 表中的数据解析成三个新表?Tag 表不应包含重复项。此外,在将数据插入新表之前,我需要对数据进行一些格式化,例如需要从 Length 列中删除所有字母。
我会怎么做。
使用辅助数字表,您可以将标签列拆分为行,同时保持与 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) = ','
从这里使用数字表获取拆分字符串
试试这个,假设 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 函数来自这里