Schlechtes BAD-Datenbankdesign wird repariert, sobald sich Daten im System befinden

7

Ich weiß, dass das keine Frage ist ... eh jedenfalls HIER ist die Frage.

Ich habe eine Datenbank geerbt, die 1 (eine) Tabelle hat, die in etwa so aussieht. Sein Ziel ist es, zu registrieren, welche Arten in den verschiedenen (200 ungeraden) Ländern gefunden werden.

%Vor%

Ein Beispiel für die Daten wäre etwa so

%Vor%

Es scheint mir, dass dies eine typische Situation für viele ist und ich möchte 3 Tische. Art, Land und ArtFoundInCountry

Die Linktabelle (SpeciesFoundInCountry) würde sowohl in den Arten als auch in den Landtabellen Fremdschlüssel enthalten.

(Es ist schwer, das Diagramm zu zeichnen!)

%Vor%

Gibt es einen magischen Weg, wie ich eine Insert-Anweisung erzeugen kann, die die CountryID aus der neuen Country-Tabelle basierend auf dem Spaltennamen und der SpeciesID erhält, wo es eine 1 in der ursprünglichen Megatabelle gibt?

Ich kann es für ein Land machen (das ist eine Auswahl um zu zeigen, was ich will)

%Vor%

(der Mega-Tisch heißt Spezies)

Aber mit dieser Strategie müsste ich die Abfrage für jede Spalte in der Originaltabelle durchführen.

Gibt es eine Möglichkeit, dies in SQL zu tun?

Ich denke, ich kann ODER eine Ladung meiner where-Klauseln zusammen und schreibe ein Skript, um die sql zu machen, scheint aber unelegant!

Irgendwelche Gedanken (oder Klärung erforderlich)?

    
Loofer 16.09.2008, 20:55
quelle

20 Antworten

8

Ich würde ein Skript verwenden, um alle einzelnen Abfragen zu generieren, da dies ein einmaliger Importvorgang ist.

Einige Programme wie Excel sind gut darin, verschiedene Dimensionen von Daten zu mischen (Vergleichen von Spaltennamen mit Daten innerhalb von Zeilen), aber relationale Datenbanken sind selten.

Sie können jedoch feststellen, dass einige Systeme (wie z. B. Microsoft Access) über komfortable Tools verfügen, mit denen Sie die Daten normalisieren können. Persönlich würde ich es schneller finden, das Skript zu schreiben, aber Ihre relativen Fähigkeiten mit Access und Scripting könnten sich von meinen unterscheiden.

    
Leigh Caldwell 16.09.2008, 21:00
quelle
8

Warum willst du es in SQL machen? Schreiben Sie einfach ein kleines Skript, das die Konvertierung durchführt.

    
Sarien 16.09.2008 20:58
quelle
3

Wenn ich auf diese Beispiele stoße, schreibe ich ein Skript, um die Konvertierung zu machen, anstatt es in SQL zu tun. Es ist normalerweise viel schneller und einfacher für mich. Wählen Sie eine beliebige Sprache aus, mit der Sie vertraut sind.

    
StubbornMule 16.09.2008 21:01
quelle
2

Wenn dies SQL Server wäre, würden Sie die Unpivot-Befehle verwenden, aber wenn Sie das Tag betrachten, das Sie zugewiesen haben, ist es für den Zugriff - habe ich recht?

Obwohl es einen Pivoting-Befehl im Zugriff gibt , gibt es keine Reverse-Anweisung.

Sieht so aus, als könnte es mit einem komplexen Join gemacht werden. In diesem interessanten Artikel erfahren Sie, wie Sie in einem Select-Befehl die Option "Unpivot" deaktivieren können.

    
digiguru 16.09.2008 21:24
quelle
1

Sie werden vermutlich Ersatztabellen erstellen wollen. Die Art des Skripts hängt von der Skriptsprache ab, die Ihnen zur Verfügung steht. Sie sollten jedoch in der Lage sein, die Länder-ID-Tabelle zu erstellen, indem Sie einfach die Spalten der Tabelle auflisten, die Sie jetzt haben. Sobald Sie dies getan haben, können Sie einige Zeichenfolgen ersetzen, um alle eindeutigen Ländernamen zu durchlaufen und in die Tabelle speziesFoundInCountry einzufügen, in der die angegebene Länderspalte nicht null ist.

    
nsayer 16.09.2008 20:59
quelle
1

Sie könnten wahrscheinlich schlau werden und die Systemtabellen nach den Spaltennamen abfragen und dann eine dynamische Abfrage-Zeichenkette zur Ausführung erstellen, aber ehrlich gesagt ist das wahrscheinlich hässlicher als ein schnelles Skript, um die SQL-Anweisungen für Sie zu generieren.

>

Hoffentlich haben Sie nicht zu viel dynamischen SQL-Code, der auf die alten Tabellen in Ihrer Codebasis zugreift. Das könnte der wirklich schwierige Teil sein.

    
Eric Z Beard 16.09.2008 21:01
quelle
1

In SQL Server generiert dies Ihre benutzerdefinierte Auswahl, die Sie demonstrieren. Sie können auf eine Einfügung extrapolieren

%Vor%
    
Tom Ritter 16.09.2008 21:03
quelle
1

Wie bei den anderen würde ich es wahrscheinlich als eine einmalige schnelle Lösung in irgendeiner Weise für Sie arbeiten.

Bei diesen Arten von Conversions handelt es sich um Einzelstücke, Schnellkorrekturen, und der Code muss nicht elegant sein, er muss einfach funktionieren. Für diese Art von Dingen habe ich es auf viele Arten gemacht.

    
Mitchel Sellers 16.09.2008 21:03
quelle
1

Wenn dies SQL Server ist, können Sie die Tabelle sys.columns verwenden, um alle Spalten der ursprünglichen Tabelle zu finden. Dann können Sie dynamisches SQL und den Pivot-Befehl verwenden, um das zu tun, was Sie wollen. Suche diese online nach Syntax.

    
eulerfx 16.09.2008 21:03
quelle
1

Ich würde definitiv Ihrem Vorschlag zustimmen, ein kleines Skript zu schreiben, um Ihr SQL mit einer Abfrage für jede Spalte zu erstellen.

Tatsächlich könnte Ihr Skript bereits in der Zeit fertig sein, in der Sie über diese magische Frage nachgedacht haben (die Sie nur einmal benutzen und dann wegwerfen würden, also was nützt es, alles magisch und perfekt zu machen) / p>     

Dave Schenk 16.09.2008 21:10
quelle
1

Tut mir leid, aber der blutige Posting-Parser hat den Whitespace und die Formatierung meines Posts entfernt. Es macht es schwerer, ein Log zu lesen.

    
STOMP 16.09.2008 21:57
quelle
1

@stomp:

Über dem Feld, in das Sie die Antwort eingeben, befinden sich mehrere Schaltflächen. Der Code 101010 ist ein Codebeispiel. Sie wählen alle Ihren Text, der Code ist, und klicken Sie dann auf diese Schaltfläche. Dann wird es nicht viel durcheinander gebracht.

%Vor%     
CindyH 16.09.2008 22:51
quelle
1

Ich würde eine Union-Abfrage sehr grob verwenden:

%Vor%

Sie hätten dann eine Ansicht, die an Ihr neues Design angehängt werden könnte.

    
Fionnuala 16.09.2008 23:13
quelle
1
___ qstnhdr ___ Schlechtes BAD-Datenbankdesign wird repariert, sobald sich Daten im System befinden ___ answer77038 ___

Wenn ich auf diese Beispiele stoße, schreibe ich ein Skript, um die Konvertierung zu machen, anstatt es in SQL zu tun. Es ist normalerweise viel schneller und einfacher für mich. Wählen Sie eine beliebige Sprache aus, mit der Sie vertraut sind.

    
___ answer77028 ___

Ich würde ein Skript verwenden, um alle einzelnen Abfragen zu generieren, da dies ein einmaliger Importvorgang ist.

Einige Programme wie Excel sind gut darin, verschiedene Dimensionen von Daten zu mischen (Vergleichen von Spaltennamen mit Daten innerhalb von Zeilen), aber relationale Datenbanken sind selten.

Sie können jedoch feststellen, dass einige Systeme (wie z. B. Microsoft Access) über komfortable Tools verfügen, mit denen Sie die Daten normalisieren können. Persönlich würde ich es schneller finden, das Skript zu schreiben, aber Ihre relativen Fähigkeiten mit Access und Scripting könnten sich von meinen unterscheiden.

    
___ qstntxt ___

Ich weiß, dass das keine Frage ist ... eh jedenfalls HIER ist die Frage.

Ich habe eine Datenbank geerbt, die 1 (eine) Tabelle hat, die in etwa so aussieht. Sein Ziel ist es, zu registrieren, welche Arten in den verschiedenen (200 ungeraden) Ländern gefunden werden.

%Vor%

Ein Beispiel für die Daten wäre etwa so

%Vor%

Es scheint mir, dass dies eine typische Situation für viele ist und ich möchte 3 Tische. Art, Land und ArtFoundInCountry

Die Linktabelle (SpeciesFoundInCountry) würde sowohl in den Arten als auch in den Landtabellen Fremdschlüssel enthalten.

(Es ist schwer, das Diagramm zu zeichnen!)

%Vor%

Gibt es einen magischen Weg, wie ich eine Insert-Anweisung erzeugen kann, die die CountryID aus der neuen Country-Tabelle basierend auf dem Spaltennamen und der SpeciesID erhält, wo es eine 1 in der ursprünglichen Megatabelle gibt?

Ich kann es für ein Land machen (das ist eine Auswahl um zu zeigen, was ich will)

%Vor%

(der Mega-Tisch heißt Spezies)

Aber mit dieser Strategie müsste ich die Abfrage für jede Spalte in der Originaltabelle durchführen.

Gibt es eine Möglichkeit, dies in SQL zu tun?

Ich denke, ich kann ODER eine Ladung meiner where-Klauseln zusammen und schreibe ein Skript, um die sql zu machen, scheint aber unelegant!

Irgendwelche Gedanken (oder Klärung erforderlich)?

    
___ answer76999 ___

Warum willst du es in SQL machen? Schreiben Sie einfach ein kleines Skript, das die Konvertierung durchführt.

    
___ answer77054 ___

In SQL Server generiert dies Ihre benutzerdefinierte Auswahl, die Sie demonstrieren. Sie können auf eine Einfügung extrapolieren

%Vor%
    
___ answer77039 ___

Sie könnten wahrscheinlich schlau werden und die Systemtabellen nach den Spaltennamen abfragen und dann eine dynamische Abfrage-Zeichenkette zur Ausführung erstellen, aber ehrlich gesagt ist das wahrscheinlich hässlicher als ein schnelles Skript, um die SQL-Anweisungen für Sie zu generieren.

>

Hoffentlich haben Sie nicht zu viel dynamischen SQL-Code, der auf die alten Tabellen in Ihrer Codebasis zugreift. Das könnte der wirklich schwierige Teil sein.

    
___ answer77070 ___

Wenn dies SQL Server ist, können Sie die Tabelle sys.columns verwenden, um alle Spalten der ursprünglichen Tabelle zu finden. Dann können Sie dynamisches SQL und den Pivot-Befehl verwenden, um das zu tun, was Sie wollen. Suche diese online nach Syntax.

    
___ answer77017 ___

Sie werden vermutlich Ersatztabellen erstellen wollen. Die Art des Skripts hängt von der Skriptsprache ab, die Ihnen zur Verfügung steht. Sie sollten jedoch in der Lage sein, die Länder-ID-Tabelle zu erstellen, indem Sie einfach die Spalten der Tabelle auflisten, die Sie jetzt haben. Sobald Sie dies getan haben, können Sie einige Zeichenfolgen ersetzen, um alle eindeutigen Ländernamen zu durchlaufen und in die Tabelle speziesFoundInCountry einzufügen, in der die angegebene Länderspalte nicht null ist.

    
___ answer77283 ___

Wenn dies SQL Server wäre, würden Sie die Unpivot-Befehle verwenden, aber wenn Sie das Tag betrachten, das Sie zugewiesen haben, ist es für den Zugriff - habe ich recht?

Obwohl es einen Pivoting-Befehl im Zugriff gibt , gibt es keine Reverse-Anweisung.

Sieht so aus, als könnte es mit einem komplexen Join gemacht werden. In diesem interessanten Artikel erfahren Sie, wie Sie in einem Select-Befehl die Option "Unpivot" deaktivieren können.

    
___ answer77633 ___

Tut mir leid, aber der blutige Posting-Parser hat den Whitespace und die Formatierung meines Posts entfernt. Es macht es schwerer, ein Log zu lesen.

    
___ answer77068 ___

Wie bei den anderen würde ich es wahrscheinlich als eine einmalige schnelle Lösung in irgendeiner Weise für Sie arbeiten.

Bei diesen Arten von Conversions handelt es sich um Einzelstücke, Schnellkorrekturen, und der Code muss nicht elegant sein, er muss einfach funktionieren. Für diese Art von Dingen habe ich es auf viele Arten gemacht.

    
___ antwort78348 ___

Als ich den Titel "bad BAD database design" gelesen habe, war ich neugierig, wie schlimm das ist. Du hast mich nicht enttäuscht:)

Wie bereits erwähnt, wäre ein Skript der einfachste Weg. Dies kann durch Schreiben von etwa 15 Zeilen Code in PHP erreicht werden.

%Vor%

Offensichtlich ist das ein Pseudocode und wird nicht so funktionieren, wie er ist. Sie können auch die Länder- und Arten-Tabelle im laufenden Betrieb ausfüllen, indem Sie hier Anweisungen einfügen.

    
___ answer78130 ___

@stomp:

Über dem Feld, in das Sie die Antwort eingeben, befinden sich mehrere Schaltflächen. Der Code 101010 ist ein Codebeispiel. Sie wählen alle Ihren Text, der Code ist, und klicken Sie dann auf diese Schaltfläche. Dann wird es nicht viel durcheinander gebracht.

%Vor%     
___ answer77149 ___

Ich würde definitiv Ihrem Vorschlag zustimmen, ein kleines Skript zu schreiben, um Ihr SQL mit einer Abfrage für jede Spalte zu erstellen.

Tatsächlich könnte Ihr Skript bereits in der Zeit fertig sein, in der Sie über diese magische Frage nachgedacht haben (die Sie nur einmal benutzen und dann wegwerfen würden, also was nützt es, alles magisch und perfekt zu machen) / p>     

___ answer78249 ___

Ich würde eine Union-Abfrage sehr grob verwenden:

%Vor%

Sie hätten dann eine Ansicht, die an Ihr neues Design angehängt werden könnte.

    
___ answer78464 ___

Tut mir leid, ich habe sehr wenig Access-Programmierung gemacht, aber ich kann eine Anleitung anbieten, die helfen sollte.

Lassen Sie uns zuerst das Problem durchgehen. Es wird angenommen, dass Sie in der Regel mehrere Zeilen in SpeciesFoundInCountry für jede Zeile in der ursprünglichen Tabelle generieren müssen. Mit anderen Worten: Arten leben in mehr als einem Land. Dies ist mit einem kartesischen Produkt, einem Join ohne Join-Kriterien, einfach möglich.

Um ein kartesisches Produkt zu erstellen, müssen Sie die Tabelle Land erstellen. Die Tabelle sollte die country_id von 1 bis N haben (N ist die Anzahl der eindeutigen Länder, 200 oder so) und den Ländernamen. Um das Leben einfacher zu machen, benutzen Sie einfach die Zahlen 1 bis N in Spaltenreihenfolge. Das würde Afghanistan 1 und Albanien 2 ... Simbabwe N machen. Sie sollten dazu in der Lage sein, die Systemtabellen zu benutzen.

Erstellen Sie als Nächstes eine Tabelle oder Ansicht aus der ursprünglichen Tabelle, die die Spezies und einen Stich mit einer 0 oder 1 für jedes Land enthält. Sie müssen die Null, nicht Null in einen Text 0 oder 1 konvertieren und alle Werte in einer einzigen Zeichenfolge verketten. Eine Beschreibung der Tabelle und ein Texteditor mit regulären Ausdrücken sollten dies erleichtern. Experimentiere zuerst mit einer einzelnen Spalte und sobald das funktioniert, bearbeite die create view / insert mit allen Spalten.

Als Nächstes verbinden Sie die beiden Tabellen ohne Verbindungskriterien. Dies wird Ihnen eine Aufzeichnung für jede Spezies in jedem Land geben, Sie sind fast da.

Jetzt müssen Sie nur die Datensätze ausfiltern, die nicht gültig sind. Sie haben an der entsprechenden Stelle in der Zeichenfolge eine Null. Da die country_code-Spalte der Landtabelle die Position der Teilzeichenfolge hat, müssen Sie nur die Datensätze ausfiltern, deren Wert 0 ist.

%Vor%

Sie müssen immer noch die Arten-Tabelle erstellen und sich daran anschließen

%Vor%

a und b sind Tabellenaliase.

Hoffen Sie diese Hilfe

    
___ answer225462 ___

Als ich mit ähnlichen Problemen konfrontiert wurde, fand ich es praktisch, ein Skript zu generieren, das SQL-Skripte generiert. Hier ist die Probe, die Sie gegeben haben, um% PAR1% anstelle von Afghanistan zu verwenden.

%Vor%

Auch das Schlüsselwort union wurde hinzugefügt, um alle Auswahlmöglichkeiten zu kombinieren.

Als Nächstes benötigen Sie eine Liste der Länder, die aus Ihren vorhandenen Daten generiert wurden:

Afghanistan Albanien . , .

Als nächstes benötigen Sie ein Skript, das die Länderliste durchlaufen kann, und für jede Iteration, produzieren eine Leistung, die Afghanistan für% PAR1% in der ersten Iteration, Albanien für die zweite Iteration und so weiter ersetzt. Der Algorithmus ist wie ein Mail-Merge in einem Textverarbeitungsprogramm. Es ist ein wenig Arbeit, dieses Skript zu schreiben. Aber sobald Sie es haben, können Sie es in Dutzenden von Einzelprojekten wie diesem verwenden.

Schließlich müssen Sie die letzte "UNION" manuell wieder in ein Semikolon ändern.

Wenn Sie Access erhalten können, um diese riesige Verbindung auszuführen, können Sie die gewünschten Daten in der von Ihnen gewünschten Form erhalten und in Ihre neue Tabelle einfügen.

    
___ answer119036 ___

Wenn ich jemals eine Menge ähnlicher SQL-Anweisungen erstellen und alle ausführen muss, finde ich Excel oft sehr praktisch. Nimm deine ursprüngliche Anfrage. Wenn Sie eine Länderliste in Spalte A und Ihre SQL-Anweisung in Spalte B haben, formatiert als Text (in Anführungszeichen) mit Zellbezügen eingefügt, wo das Land in der SQL erscheint

z.B.="INSERT INTO new_table SELECT ... (Spezies." & Amp; A1 & amp; ") = ...));"

Kopieren Sie dann die Formel herunter, um 200 verschiedene SQL-Anweisungen zu erstellen, kopieren Sie die Spalte in Ihren Editor und drücken Sie F5. Sie können dies natürlich mit so vielen Variablen tun, wie Sie möchten.

    
___ answer78505 ___

OBTW,

Wenn Sie Abfragen haben, die bereits für die alte Tabelle ausgeführt werden, müssen Sie eine Ansicht erstellen, die die alten Tabellen mit den neuen Tabellen repliziert. Sie müssen eine Gruppe erstellen, um die Tabellen zu denormalisieren.

Sagen Sie Ihren Benutzern, dass die alte Tabelle / Ansicht in Zukunft nicht mehr unterstützt wird und alle neuen Abfragen oder Aktualisierungen älterer Abfragen die neuen Tabellen verwenden müssen.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ tag123databasedesign ___ Datenbankdesign ist der Prozess der Angabe der logischen und / oder physischen Teile einer Datenbank. Das Ziel des Datenbankentwurfs besteht darin, ein "Universum des Diskurses" darzustellen - die Arten von Fakten, Geschäftsregeln und andere Anforderungen, die die Datenbank modellieren soll. ___ answer77610 ___

Ich würde es zu einem dreistufigen Prozess mit einer leichten vorübergehenden Änderung Ihrer SpeciesFoundInCountry-Tabelle machen. Ich würde eine Spalte zu dieser Tabelle hinzufügen, um den Country-Namen zu speichern. Dann wären die Schritte wie folgt.

1) Erstellen / Ausführen eines Skripts, das Spalten in der Quelltabelle durchläuft und einen Datensatz in SpeciesFoundInCountry für jede Spalte mit einem wahren Wert erstellt. Dieser Datensatz enthält den Namen des Landes. 2) Führen Sie eine SQL-Anweisung aus, die das SpeciesFoundInCountry.CountryID-Feld aktualisiert, indem Sie der Country-Tabelle für den Country Name beitreten. 3) Bereinigen Sie die SpeciesFoundInCountry-Tabelle, indem Sie die CountryName-Spalte entfernen.

Hier ist ein kleiner MS Access VB / VBA Pseudocode, um Ihnen den Kern zu geben

%Vor%

Danach können Sie eine einfache SQL-Anweisung ausführen, um die CountryID-Werte in der SpeciesFoundInCountry-Tabelle zu aktualisieren.

UPDATE SpeciesFoundInCountry INNER JOIN Land ON SpeciesFoundInCountry.CountryName = Land.CountryName SET SpeciesFoundInCountry.CountryID = Land.CountryID;

Schließlich müssen Sie lediglich die Tabelle SpeciesFoundInCountry aufräumen, indem Sie die Spalte CountryName entfernen.

**** SEITENHINWEIS: Ich fand es nützlich, Länderlisten zu haben, die auch die ISO-Abkürzungen (Ländercodes) enthalten. Gelegentlich werden sie als Fremdschlüssel in anderen Tabellen verwendet, so dass ein Join zur Tabelle Country nicht in Abfragen eingeschlossen werden muss.

Weitere Informationen: Ссылка

    
___ tag123msaccess ___ Microsoft Access, auch als Microsoft Office Access bezeichnet, ist ein Datenbankverwaltungssystem von Microsoft, das häufig die relationale Microsoft Jet / ACE-Datenbank-Engine mit einer grafischen Benutzeroberfläche und Softwareentwicklungstools kombiniert. Eine Reihe von anderen Datenbank-Engines wie SQL Server kann auch als Back-End verwendet werden. ___ answer197683 ___

Dies ist (hoffentlich) eine einmalige Übung, daher ist eine unelegante Lösung vielleicht nicht so schlimm wie es klingt.

Das Problem (ich bin mir sicher, dass Sie das nur zu gut wissen!) ist, dass Sie irgendwann in Ihrer Abfrage alle diese Spalten auflisten müssen. :( Die Frage ist, was ist der eleganteste Weg, dies zu tun? Unten ist mein Versuch. Es sieht unhandlich aus, weil es so viele Spalten gibt, aber es könnte sein, was Sie suchen, oder zumindest könnte es Sie in der zeigen richtige Richtung.

Mögliche SQL-Lösung:

%Vor%

Mein Vorschlag

Persönlich würde ich das nicht tun. Ich würde eine schnelle und schmutzige Lösung machen, wie die, auf die du anspielst, außer dass ich die Länder-IDs fest codiere (weil du das nur einmal tun wirst, oder? Und du kannst es direkt nach der Erstellung des Landtabelle, damit Sie wissen, was alle IDs sind):

%Vor%     
___
Gaurav 16.09.2008 23:30
quelle
1

Tut mir leid, ich habe sehr wenig Access-Programmierung gemacht, aber ich kann eine Anleitung anbieten, die helfen sollte.

Lassen Sie uns zuerst das Problem durchgehen. Es wird angenommen, dass Sie in der Regel mehrere Zeilen in SpeciesFoundInCountry für jede Zeile in der ursprünglichen Tabelle generieren müssen. Mit anderen Worten: Arten leben in mehr als einem Land. Dies ist mit einem kartesischen Produkt, einem Join ohne Join-Kriterien, einfach möglich.

Um ein kartesisches Produkt zu erstellen, müssen Sie die Tabelle Land erstellen. Die Tabelle sollte die country_id von 1 bis N haben (N ist die Anzahl der eindeutigen Länder, 200 oder so) und den Ländernamen. Um das Leben einfacher zu machen, benutzen Sie einfach die Zahlen 1 bis N in Spaltenreihenfolge. Das würde Afghanistan 1 und Albanien 2 ... Simbabwe N machen. Sie sollten dazu in der Lage sein, die Systemtabellen zu benutzen.

Erstellen Sie als Nächstes eine Tabelle oder Ansicht aus der ursprünglichen Tabelle, die die Spezies und einen Stich mit einer 0 oder 1 für jedes Land enthält. Sie müssen die Null, nicht Null in einen Text 0 oder 1 konvertieren und alle Werte in einer einzigen Zeichenfolge verketten. Eine Beschreibung der Tabelle und ein Texteditor mit regulären Ausdrücken sollten dies erleichtern. Experimentiere zuerst mit einer einzelnen Spalte und sobald das funktioniert, bearbeite die create view / insert mit allen Spalten.

Als Nächstes verbinden Sie die beiden Tabellen ohne Verbindungskriterien. Dies wird Ihnen eine Aufzeichnung für jede Spezies in jedem Land geben, Sie sind fast da.

Jetzt müssen Sie nur die Datensätze ausfiltern, die nicht gültig sind. Sie haben an der entsprechenden Stelle in der Zeichenfolge eine Null. Da die country_code-Spalte der Landtabelle die Position der Teilzeichenfolge hat, müssen Sie nur die Datensätze ausfiltern, deren Wert 0 ist.

%Vor%

Sie müssen immer noch die Arten-Tabelle erstellen und sich daran anschließen

%Vor%

a und b sind Tabellenaliase.

Hoffen Sie diese Hilfe

    
user14336 16.09.2008 23:54
quelle
1

OBTW,

Wenn Sie Abfragen haben, die bereits für die alte Tabelle ausgeführt werden, müssen Sie eine Ansicht erstellen, die die alten Tabellen mit den neuen Tabellen repliziert. Sie müssen eine Gruppe erstellen, um die Tabellen zu denormalisieren.

Sagen Sie Ihren Benutzern, dass die alte Tabelle / Ansicht in Zukunft nicht mehr unterstützt wird und alle neuen Abfragen oder Aktualisierungen älterer Abfragen die neuen Tabellen verwenden müssen.

    
user14336 17.09.2008 00:02
quelle
1

Wenn ich jemals eine Menge ähnlicher SQL-Anweisungen erstellen und alle ausführen muss, finde ich Excel oft sehr praktisch. Nimm deine ursprüngliche Anfrage. Wenn Sie eine Länderliste in Spalte A und Ihre SQL-Anweisung in Spalte B haben, formatiert als Text (in Anführungszeichen) mit Zellbezügen eingefügt, wo das Land in der SQL erscheint

z.B.="INSERT INTO new_table SELECT ... (Spezies." & Amp; A1 & amp; ") = ...));"

Kopieren Sie dann die Formel herunter, um 200 verschiedene SQL-Anweisungen zu erstellen, kopieren Sie die Spalte in Ihren Editor und drücken Sie F5. Sie können dies natürlich mit so vielen Variablen tun, wie Sie möchten.

    
Glenn M 23.09.2008 03:59
quelle
1

Als ich mit ähnlichen Problemen konfrontiert wurde, fand ich es praktisch, ein Skript zu generieren, das SQL-Skripte generiert. Hier ist die Probe, die Sie gegeben haben, um% PAR1% anstelle von Afghanistan zu verwenden.

%Vor%

Auch das Schlüsselwort union wurde hinzugefügt, um alle Auswahlmöglichkeiten zu kombinieren.

Als Nächstes benötigen Sie eine Liste der Länder, die aus Ihren vorhandenen Daten generiert wurden:

Afghanistan Albanien . , .

Als nächstes benötigen Sie ein Skript, das die Länderliste durchlaufen kann, und für jede Iteration, produzieren eine Leistung, die Afghanistan für% PAR1% in der ersten Iteration, Albanien für die zweite Iteration und so weiter ersetzt. Der Algorithmus ist wie ein Mail-Merge in einem Textverarbeitungsprogramm. Es ist ein wenig Arbeit, dieses Skript zu schreiben. Aber sobald Sie es haben, können Sie es in Dutzenden von Einzelprojekten wie diesem verwenden.

Schließlich müssen Sie die letzte "UNION" manuell wieder in ein Semikolon ändern.

Wenn Sie Access erhalten können, um diese riesige Verbindung auszuführen, können Sie die gewünschten Daten in der von Ihnen gewünschten Form erhalten und in Ihre neue Tabelle einfügen.

    
Walter Mitty 22.10.2008 11:59
quelle
1

Ich würde es zu einem dreistufigen Prozess mit einer leichten vorübergehenden Änderung Ihrer SpeciesFoundInCountry-Tabelle machen. Ich würde eine Spalte zu dieser Tabelle hinzufügen, um den Country-Namen zu speichern. Dann wären die Schritte wie folgt.

1) Erstellen / Ausführen eines Skripts, das Spalten in der Quelltabelle durchläuft und einen Datensatz in SpeciesFoundInCountry für jede Spalte mit einem wahren Wert erstellt. Dieser Datensatz enthält den Namen des Landes. 2) Führen Sie eine SQL-Anweisung aus, die das SpeciesFoundInCountry.CountryID-Feld aktualisiert, indem Sie der Country-Tabelle für den Country Name beitreten. 3) Bereinigen Sie die SpeciesFoundInCountry-Tabelle, indem Sie die CountryName-Spalte entfernen.

Hier ist ein kleiner MS Access VB / VBA Pseudocode, um Ihnen den Kern zu geben

%Vor%

Danach können Sie eine einfache SQL-Anweisung ausführen, um die CountryID-Werte in der SpeciesFoundInCountry-Tabelle zu aktualisieren.

UPDATE SpeciesFoundInCountry INNER JOIN Land ON SpeciesFoundInCountry.CountryName = Land.CountryName SET SpeciesFoundInCountry.CountryID = Land.CountryID;

Schließlich müssen Sie lediglich die Tabelle SpeciesFoundInCountry aufräumen, indem Sie die Spalte CountryName entfernen.

**** SEITENHINWEIS: Ich fand es nützlich, Länderlisten zu haben, die auch die ISO-Abkürzungen (Ländercodes) enthalten. Gelegentlich werden sie als Fremdschlüssel in anderen Tabellen verwendet, so dass ein Join zur Tabelle Country nicht in Abfragen eingeschlossen werden muss.

Weitere Informationen: Ссылка

    
STOMP 16.09.2008 21:55
quelle
1

Dies ist (hoffentlich) eine einmalige Übung, daher ist eine unelegante Lösung vielleicht nicht so schlimm wie es klingt.

Das Problem (ich bin mir sicher, dass Sie das nur zu gut wissen!) ist, dass Sie irgendwann in Ihrer Abfrage alle diese Spalten auflisten müssen. :( Die Frage ist, was ist der eleganteste Weg, dies zu tun? Unten ist mein Versuch. Es sieht unhandlich aus, weil es so viele Spalten gibt, aber es könnte sein, was Sie suchen, oder zumindest könnte es Sie in der zeigen richtige Richtung.

Mögliche SQL-Lösung:

%Vor%

Mein Vorschlag

Persönlich würde ich das nicht tun. Ich würde eine schnelle und schmutzige Lösung machen, wie die, auf die du anspielst, außer dass ich die Länder-IDs fest codiere (weil du das nur einmal tun wirst, oder? Und du kannst es direkt nach der Erstellung des Landtabelle, damit Sie wissen, was alle IDs sind):

%Vor%     
AJ. 13.10.2008 14:07
quelle

Tags und Links