Benutzer mit den meisten Antworten
Tabelle normalisieren

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
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- Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 9. April 2014 05:34
- Als Antwort markiert Ciprian Bogdan Mittwoch, 16. April 2014 15:28
Alle Antworten
-
-
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
-
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- Als Antwort vorgeschlagen Olaf HelperMVP Mittwoch, 9. April 2014 05:34
- Als Antwort markiert Ciprian Bogdan Mittwoch, 16. April 2014 15:28
-
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-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.