SQL Select mit Fremdschlüssel

Deathcore

Lieutenant
Registriert
Apr. 2009
Beiträge
712
Hallo Leute.

Wir haben ca folgendes Schema:

Tabelle Auftrag:

Auftrags_nr Status Hinweis Datum .....

Tabelle Auftrag_Pos

POS Anzahl Preis Text Auftrags_nr (FK aus der Tabelle Auftrag)

Eine Aufgabe lautet: (Leider sollen wir die Tabelle nicht echt umsetzten!!!)

Bestimmen sie alle Auftagsnummer, die Positionen enthalten, deren Umsatz mehr als 100 € beträgt.

Ich würde den Select so bauen:

PHP:
select a.auftragsnr 
from auftrags_pos as p, auftrag as a 
where p.auftrags_nr = a.auftrags_nr and p.preis>100;

Andere bauen den Select so:

PHP:
select p.auftragsnr 
from auftrags_pos as p
where p.preis>100;


Ist der 2 Select auch noch richtig oder muss man bezug auf die Tabelle nehmen?
 
Der 2 Select reicht aus, da dort ja auch die Auftragsnr. steht.
Wenn du allerdings auch das Datum mitausgeben willst brauchst du Version 1
 
Da alle Informationen, die du brauchst, in der Tabelle auftrags_pos enthalten sind, brauchst du die auftrag-Tabelle nicht mit abzufragen. Allerdings würde ich "select distinct" nutzen, weil sonst die Ergebnisliste möglicherweise doppelte Eintröge enthalten könnte.
 
Der 2 Select funktioniert auch. Ist sogar "besser" da er nur auf eine Tabelle zugreifen muss.
Da in der Tabelle "Auftrags_pos" auch die "Auftrags_nr" vorhanden ist, ist eine Verbindung zur anderen Tabelle unnötig.
 
Hi,

die zweite reicht aus. Nur wenn du Info's zum Auftrag an sich brauchst musst du eine Verbindung zur Auftrag-Tabelle herstellen.

Und NullPointer hat recht: Distinct wäre hier hilfreich, damit du nicht mehrfach ein und die selbe Auftragsnummer ausgibst.

VG,
Mad
 
Also beide Querys liefern dasselbe Ergebnis, da es sich bei auftrags_nr um einen Foreign Key handelt. D.h. in auftrags_pos kann die auftrags_nr nur existieren, wenn sie auch in auftrag existiert.
 
Hi,
Ich kenne die Tabellen und die AUfgabenstellung zwar nicht, allerdings meine ich, das folgendes gilt:
Ein Auftrag hat eine Eindeutige Auftragsnummer, steht also nur einmal in der Tabelle Auftrag
Ein Auftrag hat mehrere Positionen, ein Auftrag wird also mehrfach in Auftrag_Pos referenziert.

Das Problem das sich aus dieser Tatsache in der 2. Version ergibt ist, dass eine Auftragsnummer mehrfach auftauchen könnte, wenn sie mehrere Positionen hat, die mehr als 100€ kosten.
Man könnte das mit einem Select DISTINCT lösen. Ich persönlich bevorzuge aber Lösung 1 auch, wenn Sie unperformanter ist, ist sie meiner Ansicht nach intuitiver.
 
Der 2. SQL ist richtig, effizient und ausreichend. Alle relevanten Daten befinden sich in der Pos-Tabelle.

Ich würde aber noch ein "distinct" einbauen, damit die Auftragsnummer nur einmal im Ergebnis erscheint:

PHP:
select distinct p.auftragsnr 
from auftrags_pos as p
where p.preis>100;
 
Danke für die Aufklärung.

Wurde mir damals was falsches beigebracht.

Der Distinct ergibt natürlich mehr als sinn!

Danke CLOSED
 
Vielleicht macht es ja Sinn, dass es für einen Auftrag mehrere Positionen gibt.
Dann würde die Ausgabe der Pos-Nr. Sinn ergeben, was aber in diesem Beispiel nicht gefordert ist.
Ich würde es allerdings in einem Kommentar erwähnen
 
Zurück
Oben