2016-05-15 14 views
1

Ich habe eine Tabelle, die Definitionen mit einem Leerzeichen und Komma Trennzeichen enthält. Die Definitionen sehen so aus: "Katze, Hund, Pferd, Haus, Stadt". Es gibt Leerzeichen, die vor oder nach dem Komma erscheinen können.Wie kann ich eine Tabelle normalisieren, indem Sie kommagetrennten Text aus einer Spalte in eine untergeordnete Tabelle extrahieren?

CREATE TABLE [dbo].[WordForm] 
(
    [WordFormId]  VARCHAR (20) NOT NULL, 
    [WordFormIdentity] INT   IDENTITY (1, 1) NOT NULL, 
    [WordId]   VARCHAR (20) NOT NULL, 
    [Definition]  VARCHAR (MAX) NULL, 

    PRIMARY KEY CLUSTERED ([WordFormId] ASC), 

    CONSTRAINT [FK_WordFormPos] 
     FOREIGN KEY ([PosId]) REFERENCES [dbo].[Pos] ([PosId]), 
    CONSTRAINT [FK_WordFormWord] 
     FOREIGN KEY ([WordId]) REFERENCES [dbo].[Word] ([WordId]) 
); 

Ich mag die Definition Spalte entfernen und es mit einer Tabelle ersetzen mit einer Definition für jede Zeile:

CREATE TABLE [dbo].[Definition] 
(
    [DefinitionId] INT IDENTITY (1, 1) NOT NULL, 
    [WordFormId] VARCHAR (20) NOT NULL, 
    [Text] VARCHAR (30) NOT NULL, 

    PRIMARY KEY CLUSTERED ([SynonymId] ASC), 

    CONSTRAINT [FK_DefinitionWordForm] 
     FOREIGN KEY ([WordFormId]) REFERENCES [dbo].[WordForm] ([WordFormId]) 
); 

Kann jemand vorschlagen, wie ich die Daten aus Definition Säule und Einsatz erfolgen kann es in die Textspalte der Zeilen in der neuen Tabelle Definition? Die Hoffnung auf eine Lösung, die auch prüfen wird Definition ist nicht null.

Vielen Dank.

+0

Verwenden Sie einfach eine String-Splitting-Funktion, um sie von Komma zu trennen, die Daten zu trimmen und die Nullen herauszufiltern. Gibt es einen bestimmten Teil, mit dem du Probleme hast? –

+0

[Aaron Bertrand zur Rettung!] (Http://sqlperformance.com/2016/03/sql-server-2016/string-split) –

+1

Gute Entscheidung zu normalisieren! – ATC

Antwort

3

Sie können die folgende Abfrage verwenden, um die durch Kommas getrennte Liste aufzuteilen und eine Zeile für jeden Definitionswert in der Liste abzurufen.

Select [WordFormId] 
    ,RTRIM(LTRIM([Definition])) [Definition] 
from 
(
SELECT t.[WordFormId] 
      ,Split.a.value('.', 'VARCHAR(100)') [Definition] 
FROM 
    (SELECT [WordFormId] 
      ,Cast ('<X>' + Replace([Definition], ',', '</X><X>') + '</X>' AS XML) AS Data 
    FROM [dbo].[WordForm] 
    ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) 
)a 

Ich habe auch LTRIM() und RTRIM() Funktionen loswerden einer weißen Flächen zu erhalten.

+0

Danke. Können Sie eine Zeile hinzufügen, um auch zu zeigen, wie ich diese Daten auch in die Definitionstabelle einfügen könnte? – Alan2

Verwandte Themen