如何将SQL表解析为多对多表

如何将SQL表解析为多对多表,sql,sql-server,database-normalization,Sql,Sql Server,Database Normalization,我有一个包含以下列的暂存表 视频网址 评级 长 缩略图 以逗号分隔的标记 视频与标签之间存在多对多关系。我创建了以下新表: 视频 标签 视频标签 如何将Staging表中的数据解析为三个新表?标记表不应包含重复项。此外,在将数据插入新表之前,我需要对数据进行一些格式化,例如,需要从长度列中删除所有字母。我将如何操作 使用此选项可以将CSV列解析为多行—另一个带有人工键的表可以将旧表链接到新表 使用另一个生成的人工键(多个联接表主键列)联接两个表以创建多个表 修复多人关系的两端 我会怎么做 使用此

我有一个包含以下列的暂存表

视频网址 评级 长 缩略图 以逗号分隔的标记 视频与标签之间存在多对多关系。我创建了以下新表:

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

我将如何操作

使用此选项可以将CSV列解析为多行—另一个带有人工键的表可以将旧表链接到新表 使用另一个生成的人工键(多个联接表主键列)联接两个表以创建多个表 修复多人关系的两端 我会怎么做

使用此选项可以将CSV列解析为多行—另一个带有人工键的表可以将旧表链接到新表 使用另一个生成的人工键(多个联接表主键列)联接两个表以创建多个表 修复多人关系的两端
使用辅助数字表,您可以将标记列拆分为行,同时将其与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) = ',' 
最后填写视频标签:

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关联:

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) = ',' 
最后填写视频标签:

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作为视频名称,并且分割字符串函数返回表具有标记名列

如果您从视频和标签表自动生成ID,则 插入videotag表时,从中获取关联的自动生成id 这是主桌


Splitstring函数来自

尝试此操作,假设videourl作为视频名称,Splitstring函数返回表具有标记名列

如果您从视频和标签表自动生成ID,则 插入videotag表时,从中获取关联的自动生成id 这是主桌


Splitstring函数来自

我很困惑,请澄清-这是纯SQL吗?在这种情况下,您应该删除ef和c标记。哎呀,忘了把它们取下来。事实上,我对SQL或实体框架解决方案都感兴趣,但我认为EF最终无法达到纯SQL的性能。我很困惑,请澄清——这纯粹是SQL吗?在这种情况下,您应该删除ef和c标记。哎呀,忘了把它们取下来。实际上,我对SQL或实体框架解决方案都感兴趣,但我认为EF最终无法接近纯SQL的性能。
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