none
Tabelle normalisieren RRS feed

  • Frage

  • Hallo Zusammen,

    ich habe bisher keine SQL Erfahrung und stehe deshalb vor einem Problem beim Normalisieren einer Tabelle.

    Bisher habe ich eine Spalte einer Tabelle in eine neue Tabelle kopiert.

    In dieser neuen Tabelle befinden sich nun genau die gleichen Daten wie in der Ursprungstabelle.

    Bei den Daten sind nun viele Einträge doppelt vorhanden.

    Ich möchte nun diese neue Tabelle  so ändern, dass jeder Eintrag nur einmal vorkommt.

    Danach möchte ich dann die Tabelle mit der alten Tabelle verknüpfen, so dass nun im alten Feld der Index der neuen Tabelle steht.

    Für das ganze suche ich ein SQL Script bzw. den/die entsprechenden Befehl/e.

    Ich habe nun schon einiges gegoogelt aber konnte bisher keine Lösung finden.

    Eigentlich hätte ich gedacht, dass diese ein übliches Problem ist. Aber eventuell ist die Frage auch falsch gestellt.

    Wie auch immer ich hoffe Ihr könnt mir ein paar Tipps geben wie man das realisiert.

    Ach so ich arbeite mit SQL Server 2012 express.

    Schon mal vielen Dank für Eure Hilfe

    Gruß

    Nunni

    Montag, 7. April 2014 17:27

Antworten

  • Hi,

    das Problem fängt schon beim Kopieren der Daten an. Hier solltest Du die neue Tabelle gleich nur mit den eindeutigen Werten füllen.

    INSERT INTO Farben
    ( Farbe )
    SELECT DISTINCT
           Farbe
    FROM   Tabelle1
    

    Damit hast Du dann nur die eindeutigen Werte, also bspw. schwarz, weiß, farblos, ... in der Tabelle, jeden aber nur einmal.

    Anschließend würde ich in Tabelle1 eine neue Spalte (INT), bspw. FarbID erstellen und diese dann aktualisieren.

    UPDATE Tabelle1
    SET    FarbID = f.FarbID
    FROM   Farben f
    WHERE  Tabelle1.Farbe = f.Farbe
    

    Die alte Spalte "Farbe" aus "Tabelle1" würde ich anschließend löschen.

    Wenn jetzt der Einwand kommt "Geht nicht, brauche die Spalteninformation": Weiß ich :) Daher erstellst Du dann eine View mit ca. folgendem Aufbau:

    SELECT t1.ID
           t1.Spalte1,
           t1.Spalte2,
           t1.FarbID,
           f.Farbe
    FROM   Tabelle1 t1
           LEFT JOIN Farben f ON t1.FarbID = f.FarbID
    

    Damit hast Du dann den Farbnamen wieder in der View und diese kannst Du als Datenquelle für deine Abfragen verwenden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 8. April 2014 07:04
    Moderator

Alle Antworten

  • Hallo Nunni,

    so ganz habe ich Deine Beschreibung der Situation nicht verstanden, könntest Du DDL Statements für die bestehenden Tabellen mit ein paar Bespieldaten sowie ein Beispiel für das gewünschte Ergebnis posten?


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Montag, 7. April 2014 17:36
  • Hallo Olav,

    ich habe momentan 2 Tabellen.

    Tabelle 1 ist die Ursprungstabelle aus der habe ich den Eintrag Farbe herauskopiert und eine neue Tabelle Farbe erstellt.

    Im zweiten Bild siehst du die Daten welche in der Tabelle stehen. Hier sind viele Einträge doppelt vorhanden.

    Diese soll so reduziert werden, dass nur noch max ein gleicher Eintrag vorhanden ist.

    In der Ursprungstabelle sollte dann zum Schluss nur noch der Index der Farbtabelle stehen.

    Ich hätte gedacht, dass sowas dauernd gemacht wird.

    ----------------Tabelle Farbe----------

    Spaltenname | Datentyp

    Farb ID          |int

    Farbe             |nvarchar

    --------------Tabelle 1-------------

    Spaltenname         | Datentyp

    Stoffname              |...

    Erfassung              |...

    Aggregatszustand |...

    Farbe                     |...

    Momentan stehen in der Tabelle Farbe solche Einträge.

    FarbID|Farbe

    1         |schwarz

    2         |farblos

    3         |grau

    4         |schwarz

    5         |farblos

    ...

    ..

    Sorry Bilder haben nicht funktioniert.

    Hab versucht es so darzustellen.

    Gruß

    Nunni

    Montag, 7. April 2014 18:04
  • Hi,

    das Problem fängt schon beim Kopieren der Daten an. Hier solltest Du die neue Tabelle gleich nur mit den eindeutigen Werten füllen.

    INSERT INTO Farben
    ( Farbe )
    SELECT DISTINCT
           Farbe
    FROM   Tabelle1
    

    Damit hast Du dann nur die eindeutigen Werte, also bspw. schwarz, weiß, farblos, ... in der Tabelle, jeden aber nur einmal.

    Anschließend würde ich in Tabelle1 eine neue Spalte (INT), bspw. FarbID erstellen und diese dann aktualisieren.

    UPDATE Tabelle1
    SET    FarbID = f.FarbID
    FROM   Farben f
    WHERE  Tabelle1.Farbe = f.Farbe
    

    Die alte Spalte "Farbe" aus "Tabelle1" würde ich anschließend löschen.

    Wenn jetzt der Einwand kommt "Geht nicht, brauche die Spalteninformation": Weiß ich :) Daher erstellst Du dann eine View mit ca. folgendem Aufbau:

    SELECT t1.ID
           t1.Spalte1,
           t1.Spalte2,
           t1.FarbID,
           f.Farbe
    FROM   Tabelle1 t1
           LEFT JOIN Farben f ON t1.FarbID = f.FarbID
    

    Damit hast Du dann den Farbnamen wieder in der View und diese kannst Du als Datenquelle für deine Abfragen verwenden.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 8. April 2014 07:04
    Moderator
  • Hallo Stefan,

    vielen Dank für die Hilfe.

    Das hat mir weitergeholfen.

    Mit ein paar Anpassungen hat es geklappt.

    Gruß

    Nunni

    Dienstag, 8. April 2014 21:14
  • Hi,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.

    Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.

    Danke und viele Grüße,

    Ciprian


    Ciprian Bogdan, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-PrinzipEntwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.





    Mittwoch, 16. April 2014 15:28