0

次の列のStagingテーブルがあります

  • VideoURL
  • 評価
  • 長さ
  • サムネイル
  • タグ(カンマ区切り)

動画はタグと多対多の関係があります。次の新しいテーブルを作成しました。

  • ビデオ
  • 鬼ごっこ
  • VideoTag

ステージングテーブルのデータを3つの新しいテーブルに解析するにはどうすればよいですか?タグテーブルに重複が含まれていてはなりません。また、データを新しいテーブルに挿入する前に、データを少しフォーマットする必要があります。たとえば、[長さ]列からすべての文字を削除する必要があります。

4

3 に答える 3

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

したがって、ここでは、Tagsテーブルに一意のタグを入力します。

;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

どのように私はそれを行うだろう.

  1. この質問 を使用して、CSV 列を複数の行に解析し、古いテーブルを新しいテーブルにリンクするための人工キーを持つ別のテーブル
  2. 2 つのテーブルを別の生成された人工キー (Many many join table primary key) 列で結合して、多対多テーブルを作成します。
  3. 多対多関係の両端を修正する
于 2012-09-02T02:22:24.237 に答える
1

videourl をビデオ名として、splitstring 関数の戻りテーブルにtagname列があると仮定して、これを試してください

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

ビデオとタグ テーブルから ID を自動生成した場合、ビデオタグ テーブルに
挿入するときに、
マスター テーブルから関連付けられた自動生成 ID を取得します。

スプリットストリング機能はこちらから

于 2012-09-02T02:57:53.833 に答える