2012-09-02 59 views
0

我有一個Staging表具有以下的列如何解析SQL表分成多個多到多個表

  • VideoURL
  • 評級
  • 長度
  • 縮略圖
  • 標籤(逗號-delimited)

視頻有多對多的關係ip與標籤。我創建了以下新表:

  • 視頻
  • 標籤
  • VideoTag

如何在臨時表中的數據解析成三個新的表?標籤表不應包含重複項。另外,在將數據插入新表之前,我需要對數據進行一些格式化,例如需要從長度列中去除所有字母。

+2

我很困惑,請澄清 - 這是純粹的SQL?在這種情況下,您應該刪除ef和c#標籤。 –

+0

哎呀,忘記帶走了。實際上,我對SQL或實體框架解決方案感興趣,但EF最終無法接近直接SQL的性能。 – BrazenTongue

回答

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) = ',' 

了分割字符串使用中的數字表

1

我該怎麼做。

  1. 使用此question解析CSV柱爲多行另一個表與人工關鍵舊錶鏈接到新的
  2. 加入另一個產生的人工鍵兩個表(在許多許多加盟表的主鍵)列創建多對多表
  3. 解決了多對多的關係
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 

如果您自動生成的視頻和標籤表,然後
而IDS插入到videotag表中得到相關的自動生成的id從
它是主表。

Splitstring功能是從here