Drei Tabellen in eine einfügen und Duplikate vermeiden

Ahalya

Benutzer
Beiträge
18
Hallo erstmal,
Ich bin neu hier und hoffe mir kann jemand helfen - es ist leider ein wenig dringend, da ich es heute abgeben muss und schon seit drei Tagen an dem Fehler sitze und ihn nicht rauskriege.

Ich sitze momentan an einer Datenbank für ein Restaurant (Übung). Mein Problem ist jetzt folgendes:

Ich habe eine Tabelle - Warenkorb und müsste diese mit den Daten aus drei anderen Tabellen befüllen - Rechnung, Preis, Artikel.

Die Attribute für Warenkorb sind: Waren_ID (Auto-Increm.), Rechnungsnummer, Menge (Default 1), Artikel_ID, Preis_ID.

Es sind 3015 Rechnungsnummern vorhanden, ebenso wie Artikel und Preise.
Das Problem ist jetzt, dass ich immer ein kartesisches Produkt rauskriege, also er nimmt jede Rechnungsnummer mit jeder Artikel_ID.
Artikel_ID und Preis_ID sind jeweils identisch.

Ich wäre dankbar für jede Hilfe :)

Liebe Grüsse
 
Werbung:
Du wirst vermutlich in der Tabelle Preis einen Fremdschlüssel haben der dir sagt, zu welchem Artikel der jeweilige Preis gehört. So das ein Artikel mehrere Preise haben kann, ein Preis aber nur zu einem Artikel gehört. Irgendwie müssten auch noch Rechnungen eine Beziehung zu Artikeln haben, eigentlich in Form einer n:m Beziehung mit Zwischentabelle in der dann auch die Menge steht. Alles in allem kann man schwer eine Tabelle mit Informationen aus drei anderen befüllen wenn man deren Inhalt nicht kennt. Du solltest also erstmal alle Tabellen und ihre Spalten nennen und ggf. noch die Relationen auflisten.
 
Hallo,
Ich hab ein Tabellendiagramm, vielleicht hilft dir das weiter.
Ich häng es mal an :)
 

Anhänge

  • toprasttab.png
    toprasttab.png
    27,9 KB · Aufrufe: 6
Hallo Ahalya,

zunächst einmal die Frage, ob dieses Datenbank-Schema fix vorgegeben ist, oder ob hier noch Anpassungen von dir vorgenommen werden können.
Wenn letzteres möglich ist, würde ich die Zusammenhänge zwischen Rechnungsnummer, Warenkorb, Artikel und Preis etwas günstiger "aufhängen".

Die nächste Frage ist: was heißt genau
...diese mit den Daten aus drei anderen Tabellen befüllen ...

Nach dem Aufbau der Datenbank ist der Warenkorb ja genau die Angabe, welche Artikel in einer Rechnung angegeben werden.
D.h. dass du von irgendwoher ja die Information bekommen musst, welche Artikel jetzt genau zu einer Rechnung gehören.
Woher bekommst du diese Info?

Viele Grüße,
Tommi
 
Hallo,
Ja, das Datenbank-Schema wurde von mir so erstellt und kann angepasst werden wie "ich" möchte oder in diesem Fall, wie mir empfohlen wird ;)
Ich möchte noch dazu sagen, dass ich ziemlich unerfahren mit Datenbanken bin. :)

Ich habe das alles so gelöst, dass ich ein Script erstellt habe, dass die Datenbank erstellt, also alle Tabellen leer ect.
Und dann ein Script, dass sie befüllt, daher befüllen weil in den anderen Tabellen die nötigen Daten schon vorhanden sind :)

Und gedacht war das ganze so, dass über die Rechnungsnummer, die Rechnung identifiziert wird und dann über den Warenkorb die dazu gehörigen Artikel mit dem Preis.
Ich hoffe ich hab mich da jetzt halbwegs verständlich ausgedrückt, irgendwie bin ich mir da grad nicht so sicher :D

Liebe Grüße
 
Ja dem muss ich zustimmen. Wir haben hier einen nachvollziehbaren Datenbankaufbau, aber welche Artikel eine Rechnung beinhaltet stellt ja grade die Tabelle Warenkorb bereit. Diese Information müsste ja schon vorgegeben sein.

Ich vermute mal du hast schon Datensätze in der Tabelle und möchtest alle Rechnungen und deren Artikel einfach nur ausgeben.
 
Genau.
Es existieren 10 Artikel und 10 Preise, sowie 3015 Rechnungen (mit 15 Warenkörben, die anfangs testweise eingefügt wurden).
Jetzt sollen quasi nur noch die restlichen Rechnungen bestückt werden, daher sollte jede Rechnungsnummer nur einmal vorkommen, die Artikel_ID (=Preis_ID) aber beliebig oft.
 
Hi,

ich glaub', ich hab' 'nen Knoten im Kopf (zuviel Kaffee) - ich will's aber richtig verstehen.
Es ist also so, dass dir in der Tabelle Warenkorb also noch von ca. 3000 Rechnungen die Informationen der Artikel fehlen?

Gruß,
Tommi
 
Die Rechnungsnummern (Rechnungen) sind bereits vorhanden.
Das sind nur Testdaten, also sind die dazu gehörigen Artikel mehr oder weniger irrelevant :)

Zu diesen Rechnungen (Rechnungsnummern) fehlen mir jetzt die Warenkörbe, genau.

Ich kann die Skripte gern hier anhängen, falls das hilft (und wenn ich kann).

Liebe Grüße und schon mal Danke für deine Mühe :)
 
Ich verstehe das so das hier einfach Daten fehlen und um zufällige Daten zum testen ergänzt werden sollen...
 
So hab ich das denn auch verstanden. Da es sich ja auch nur um Testdaten handelt, hätte ich jetzt keine ethischen Probleme damit, einfach einen existierenden Warenkorb in alle anderen Rechnungsnummern zu duplizieren, bei denen diese Info noch fehlt. Ist das zu einfach?
 
Ich glaub ich drück mich heute echt blöd aus *seufzt*

Also, nochmal.
Es existieren Daten in Rechnung, Artikel und Preis.
Diese müssen jetzt einfach nur in den Warenkorb.

insert into Warenkorb (Rechnungsnummer, Artikel_ID, Preis_ID)
select [Rechnungsnummer], [Artikel_ID], [Preis_ID] from [Rechnung], [Artikel], [Preis] where [Artikel_ID] = [Preis_ID];

Mach ich das Ganze so, dann nimmt er jede Rechnungsnummer mit jeder Artikel_ID, also jeweils 10 Mal und das möchte ich vermeiden.

Ich hoffe jetzt ist es klar *lach*
 
Jetzt muss ich auch lachen ----

eigentlich haben wir alle drei das gleiche Ziel - es soll nicht jeder verfügbare Artikel in jeder Rechnungsnummer angegeben werden.
Damit sind wir genau bei der Aussage von ukulele:
...zufällige Daten zum testen ergänzt ...

(ich befürchte, ICH drücke mich grade etwas schwerfällig aus)

Bei deinem INSERT berücksichtigt du nicht die Einschränkung zwischen Rechnungsnummer und Artikel.
Das kannst du auch nicht mit den vorhandenen Daten, da ja genau diese Einschränkung durch die noch fehlenden Daten gemacht wird.

Vielleicht ist es doch ganz hilfreich die Skripte, mit denen du die Testdaten generiert hast, insbesondere für den Warenkorb, einmal zu sehen.

VG, Tommi
 
Harchja, ich mag SQL irgendwie nicht. Es raubt mir wirklich den letzten Nerv ;)
Danke auf jeden Fall schonmal für eure Geduld.

Hier sind die beiden Skripte.
toprast_create erstellt die Datenbank und toprast_full_full sollte sie dann füllen und da ist dann auch der Fehler.
Unter Notepad++ fängt er bei mir in Zeile 313 an und zieht sich bis Zeile 318, wo dann auch direkt meine neuste Schandtat zu bewundern wäre.
 

Anhänge

  • toprast_create_sql.txt
    6,6 KB · Aufrufe: 2
  • toprast_full_fill.txt
    18,8 KB · Aufrufe: 4
Werbung:
So sehe ich das auch. Du kannst entweder alles zu allem in Relation setzen und bekommst eine entsprechend große Zahl an Datensätzen (das haßt du ja auch schon richtig ausgeführt), oder du musst die Daten einschränken. Vorgaben dazu gibt es aber nicht, es gibt keine Grundlage wie das passieren soll.
 
Zurück
Oben