2012-09-02 5 views
0

j'ai une Staging table avec les colonnes suivantesComment analyser table SQL en plusieurs nombreux à plusieurs tables

  • URLvidéo
  • Note
  • Longueur
  • Miniature
  • Tags (virgule -delimited)

Les vidéos ont de nombreuses relations ip avec les tags. J'ai créé les nouvelles tables suivantes:

  • Vidéo
  • Tag
  • VideoTag

Comment puis-je analyser les données dans la table Mise en scène dans les trois nouvelles tables? La table de variables ne doit contenir aucun doublon. Aussi, je dois faire un peu de formatage sur les données avant qu'elles ne soient insérées dans les nouveaux tableaux, par ex. besoin de supprimer toutes les lettres de la colonne Longueur.

+2

Je suis confus s'il vous plaît préciser - Est-ce uniquement dans SQL? Dans ce cas, vous devez supprimer les balises ef et C#. –

+0

Oups, j'ai oublié de les enlever. En fait, je m'intéresse à une solution SQL ou Entity Framework, mais EF ne peut finalement pas se rapprocher des performances de SQL direct. – BrazenTongue

Répondre

1

Utilisation d'une table de nombres auxiliaire, vous pouvez diviser la colonne balises en lignes tout en gardant associée à le 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) = ',' 

Voici donc, nous remplissons la Balises table avec des étiquettes uniques:

;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; 

Suivant remplir la table Vidéos:

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

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

Got la chaîne fractionnée à l'aide de la table numérique de here

1

Comment je le ferais.

  1. Utilisez cette question pour analyser la colonne CSV en plusieurs lignes une autre table avec une clé artifical pour relier l'ancienne table à la nouvelle
  2. se joindre aux deux tables avec une autre clé artificielle générée (le grand nombre beaucoup rejoindre Table colonne de clé primaire) pour créer le nombre-table n
  3. réparer les deux extrémités du nombre-plusieurs
1

essayer, en supposant videoURL comme nom de la vidéo et fonction splitstring Table de retour a tagname colonne

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 

Si vous généré automatiquement ids de la table vidéo et l'étiquette puis
tout insérer dans la table videotag obtenir l'ID généré automatiquement associé de
c'est la table principale.

fonction Splitstring est de here

Questions connexes