Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Simple SQL-Abfrage mit Fremdschlüssel (https://www.delphipraxis.net/134758-simple-sql-abfrage-mit-fremdschluessel.html)

MatthiasR 28. Mai 2009 10:20

Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: ZeosLib

Simple SQL-Abfrage mit Fremdschlüssel
 
Für die meisten von euch, die halbwegs SQL-bewandert sind, ist meine Frage sicherlich ziemlich banal. Da ich aber schon lange nicht mehr mit SQL konfrontiert war, komme ich einfach nicht auf die richtige Lösung.

Ich habe eine simple Tabelle, z.B. "kunden", bestehend aus den Spalten "kunden_id" und "kundenname". Diese Tabelle wird von einer anderen genutzt mittels Fremdschlüssel. Nennen wir sie "bestellungen". Einer Bestellung kann ein Kunde mittels Fremdschlüssel zugeordnet werden, muss aber nicht (Fremdschlüssel-Spalte darf also NULL sein).

Nun möchte ich mittels SQL alle Bestellungen abfragen und gleichzeitig dazu den zugehörigen Kundennamen, falls ein Kunde angegeben wurde. Wie mache ich das?

Bisher hab ich sowas immer in die WHERE-Klausel gepackt:
SQL-Code:
SELECT b.bestellungsnummer, k.kundenname
FROM bestellungen b, kunden k
WHERE b.kunden_id = k.kunden_id;
Nur wenn jetzt in der Tabelle "bestellungen" mal kein Kunde angegeben ist, wird diese Bestellung übersprungen. Sie soll aber trotzdem zurück gegeben werden, dann halt mit leerem Namensfeld. Wie geht das nochmal? Sicherlich trivial, aber ich komm nicht drauf.

mkinzler 28. Mai 2009 10:32

Re: Simple SQL-Abfrage mit Fremdschlüssel
 
Du benötigst einen OUTER JOIN. Dies geht aber nur mit einem expliziten Join ( implizite, wie in deinem Beispiel sind immer INNER JOINS)

SQL-Code:
SELECT
    b.bestellungsnummer, k.kundenname
FROM
    bestellungen b
        left join kunden k on k.id = b.kunden.id;

MatthiasR 28. Mai 2009 10:40

Re: Simple SQL-Abfrage mit Fremdschlüssel
 
Zitat:

Zitat von mkinzler
Du benötigst einen OUTER JOIN. Dies geht aber nur mit einem expliziten Join ( implizite, wie in deinem Beispiel sind immer INNER JOINS)

SQL-Code:
SELECT
    b.bestellungsnummer, k.kundenname
FROM
    bestellungen b
        left join kunden k on k.id = b.kunden.id;

Funzt :) . Auf das mit dem LEFT JOIN wäre ich aber im Lebtag nicht gekommen...
Ich sage vielen Dank!

EDIT: "LEFT JOIN" ist das gleiche wie "LEFT OUTER JOIN" nur kürzer? Oder gibts Unterschiede (konnte zumindest keine feststellen)?

mkinzler 28. Mai 2009 10:54

Re: Simple SQL-Abfrage mit Fremdschlüssel
 
Zitat:

"LEFT JOIN" ist das gleiche wie "LEFT OUTER JOIN" nur kürzer? Oder gibts Unterschiede (konnte zumindest keine feststellen)?
Ja das ist das Selbe

p80286 28. Mai 2009 14:10

Re: Simple SQL-Abfrage mit Fremdschlüssel
 
Dumme Nachfrage:

was ist mit
SQL-Code:
WHERE b.kunden_id = k.kunden_id(+)
;

So sollte es (zumindestens unter Oracle) auch funktionieren.

Gruß
K-H

mkinzler 28. Mai 2009 14:25

Re: Simple SQL-Abfrage mit Fremdschlüssel
 
Zitat:

Zitat von p80286
Dumme Nachfrage:

was ist mit
SQL-Code:
WHERE b.kunden_id = k.kunden_id(+)
;

So sollte es (zumindestens unter Oracle) auch funktionieren.

Gruß
K-H

Aber nur bei Oracle oder Fyracle. Ist aber kein Standrad

p80286 29. Mai 2009 10:09

Re: Simple SQL-Abfrage mit Fremdschlüssel
 
Danke!

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz