Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [SQL] Hilfe bei Verknüpfung zweier Tabellen (https://www.delphipraxis.net/138162-%5Bsql%5D-hilfe-bei-verknuepfung-zweier-tabellen.html)

Nicolai1234 4. Aug 2009 15:22


[SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Hallo,

ich muss mich leider mit einem nicht-Delphi Thema an euch wenden. Ich helfe momentan bei einer Internetseite aus und muss mich dort mit PHP und einer mysql-Datenbank rumschlagen, obwohl das nicht mein Spezialgebiet ist :) Daher hoffe ich, dass ihr mir helfen könnt. Die Grundlagen habe ich soweit alle verstanden und eigentlich klappt auch alles ganz gut, nur an einer Stelle komme ich nicht weiter. Es geht um folgendes:

Ich habe zwei Tabellen:
Tabelle1: uid - gid
Tabelle2: uid - name - punkte - etc..

Es sind also zwei Tabellen, in denen jeweils die Spalte uid (User-ID) gleich ist.

Momentan frage ich Daten aus Tabelle2 so ab:
SQL-Code:
SELECT * FROM Tabelle2
Jetzt möchte ich aber, dass nur die Datensätze ausgewählt werden, bei denen dem User eine bestimmte gid zugeordnet ist.
Soll quasi so aussehen: (mir ist klar, dass es so leider nicht geht :( )
SQL-Code:
SELECT * FROM Tabelle2 WHERE gid = 1
Wie kann man denn die beiden Tabellen miteinander verknüpfen, dass die Abfrage richtig ist? Ich Blick da leider nicht ganz durch und hoffe auf eure Hilfe :)

Vielen Dank im Voraus

Bernhard Geyer 4. Aug 2009 15:26

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Du benötigst einen INNER JOIN

DeddyH 4. Aug 2009 16:12

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Entweder ("alte" Syntax):
SQL-Code:
SELECT T1.*, T2.*
FROM Tabelle1 T1, Tabelle2 T2
WHERE T2.uid = T1.uid
AND T1.gid = 1
oder
SQL-Code:
SELECT T1.*, T2.*
FROM Tabelle1 T1
JOIN Tabelle2 T2 ON T2.uid = T1.uid
WHERE T1.gid = 1

Nicolai1234 5. Aug 2009 22:30

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Vielen Dank, habs gestern noch mit dem INNER JOIN hinbekommen

Was bedeutet das alte Syntax bei deiner anderen Lösung? Geht die auch, aber stilistisch ist die andere besser? Und wenn ja, wer bestimmt, was stilistisch schöner ist? :)

omata 5. Aug 2009 23:12

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Die neue Syntax finde ich wesentlich schöner.
Alt und neu funktionieren bezogen auf den EQUI-JOIN in allen Datenbanken. Nur der OUTER-JOIN funktioniert in der alten Syntax nur in Oracle (Plus-Operator) sonst leider nicht. Deshalb würde ich immer die neue Variante verwenden und mir dort auch nur den LEFT-JOIN merken, der RIGHT-JOIN ist überflüssig.

mkinzler 6. Aug 2009 05:31

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Man kann bei den expliziten Joins viel genauer steuern wie verknüpft wird. Implizit geht ja nur ein INNER JOIN ( Ausnahme Oracle, wie omata schon geschrieben hat)
Zitat:

nur den LEFT-JOIN merken, der RIGHT-JOIN ist überflüssig.
So pauschal würde ich das nicht sehen

omata 6. Aug 2009 11:18

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Zitat:

Zitat von mkinzler
So pauschal würde ich das nicht sehen

Ich schon, die letzten 9 Jahre bin ich ohne ausgekommen. Die beiden JOINs unterscheiden sich ja nur in der Syntax, also welche Seite der Verknüpfung wird mit NULL aufgefüllt.

Edit: Man kann sich das Leben natürlich auch schwerer machen, und beide verschachtelt benutzen (siehe Access)

mkinzler 6. Aug 2009 11:21

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Es könnte aber ein Fall audtreten, wo man es benötigt.
Es ist wie mit While vs Repeat..Until, man kann das meiste mit einer Schleifenart lösen.

HeikoAdams 6. Aug 2009 11:24

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Zitat:

Zitat von mkinzler
Zitat:

nur den LEFT-JOIN merken, der RIGHT-JOIN ist überflüssig.
So pauschal würde ich das nicht sehen

Naja, wenn ich die Join-Bedingungen eines LEFT-JOINs vertausche und aus
SQL-Code:
... FROM a LEFT OUTER JOIN b ...
ein
SQL-Code:
... FROM b LEFT OUTER JOIN a ...
mache, dann hab ich ja quasi auch nen RIGHT-JOIN :wink:

BTW: Bislang bin ich auch ganz gut ohne RIGHT-JOINs augekommen 8)

alzaimar 6. Aug 2009 11:38

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Also wenn ich auf die Schnelle eine Query aus diversen Tabellen zusammentippe, passiert es mir einfach, das ich irgendwann ein RIGHT JOIN brauche. Ich könnte zwar die Logik umdrehen, und von vorne anfangen, um puristisch auf das RIGHT JOIN zu verzichten, aber Zeit ist Geld und so gehts eben.

Nööööötig issses nicht, aber der Vollständigkeit halber vorhanden und praktisch.

p80286 6. Aug 2009 12:40

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Also ich bevorzuge die "alte" Syntax (jo, Oracelaner),
wenn ich diese joins sehe, die ACCESS erstellt (ich weiß, ACCESS ist nicht satisfaktionsfähig) dann hab ich immer das Gefühl einen Basic-Source mit ganz vielen gotos vor mir zu haben.

funktioniert, aber undurchschaubar.

Gruß
K-H

mkinzler 6. Aug 2009 12:48

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Ich finde explizite Joins richtig eingerückt aber übersichtlicher

khh 6. Aug 2009 12:49

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Zitat:

Zitat von p80286
Also ich bevorzuge die "alte" Syntax (jo, Oracelaner),
wenn ich diese joins sehe, die ACCESS erstellt (ich weiß, ACCESS ist nicht satisfaktionsfähig) dann hab ich immer das Gefühl einen Basic-Source mit ganz vielen gotos vor mir zu haben.

funktioniert, aber undurchschaubar.

Gruß
K-H

ich hänge mich hier auch noch dran :-)
wobei
anstatt
SELECT T1.*, T2.* ...

select *
FROM Tabelle1 T1, Tabelle2 T2
WHERE T2.uid = T1.uid
AND T1.gid = 1

ja ausreichen ist.
ich finde diese "alte" Syntax liest sich irgendwie besser, und ich gebs zu ich hab auch bei oracle gelernt ;-)

Gruss KH

mkinzler 6. Aug 2009 12:55

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Was ist den an

SQL-Code:
select
    T1.*,
    T2.*
FROM
    Tabelle1 T1 
        join Tabelle2 T2 on T2.uid = T1.uid
WHERE
    T1.gid = 1;
unübersichtlich?

p80286 6. Aug 2009 16:15

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Okay, brechen wir einen Glaubenskrieg vom Zaun!!

SQL-Code:
SELECT VTP_TABDOS.CODDOS, VTP_TABBRE.IDEPAY, VTP_TABEVE.CODEVE, VTP_TABSUI.DATECH
FROM (((VTP_TABDOS INNER JOIN VTP_TABBRE ON VTP_TABDOS.IDEDOS = VTP_TABBRE.IDEDOS) INNER JOIN VTP_TABPAY ON VTP_TABBRE.IDEPAY = VTP_TABPAY.IDEPAY) INNER JOIN VTP_TABSUI ON VTP_TABBRE.IDEBRE = VTP_TABSUI.IDEDOS) INNER JOIN VTP_TABEVE ON VTP_TABSUI.IDEECH = VTP_TABEVE.IDEEVE;
SQL-Code:
SELECT VTP_TABDOS.CODDOS, VTP_TABBRE.IDEPAY, VTP_TABEVE.CODEVE, VTP_TABSUI.DATECH
FROM VTP_TABDOS,
     VTP_TABBRE,
     VTP_TABPAY,
     VTP_TABSUI,
     VTP_TABEVE
WHERE VTP_TABDOS.IDEDOS = VTP_TABBRE.IDEDOS
  and VTP_TABBRE.IDEPAY = VTP_TABPAY.IDEPAY
  and VTP_TABBRE.IDEBRE = VTP_TABSUI.IDEDOS
  and VTP_TABSUI.IDEECH = VTP_TABEVE.IDEEVE
das obere Beispiel hat Access generiert da bin ich unschuldig!
Was mich z.B. stört
SQL-Code:
(VTP_TABDOS INNER JOIN VTP_TABBRE ......) INNER JOIN VTP_TABPAY ON ....
Da wird eine Tabelle (VTP_TABPAY) mit zwei anderen Tabellen (VTP_TABDOS,VTP_TABBRE) verbunden. erst im "Nachsatz" lese ich, daß die Verbindung über
SQL-Code:
VTP_TABBRE.IDEPAY = VTP_TABPAY.IDEPAY
erfolgt.

In der unteren Version erscheint mir das einfacher zu überblicken, da pro Zeile immer nur zwei Tabellen miteinander verbunden werden, insbesonders wenn noch ein paar Tabellen dazu kommen.

Was gegen die "alte" Version spricht, ist die Vermengung von "Tabellenverbindungen" und "Wertabfragen". Wenn man da eine Fremdabfrage in die Finger bekommt ist es mit der Übersichtlichkeit schnell dahin.

Für die "alte" Version spricht die (meiner Meinung nach) einfache Auskommentierbarkeit wenn z.b. eine Tabelle hinzu kommen soll oder entfernt werden soll .

Gruß
K-H

mkinzler 6. Aug 2009 17:44

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Nur weil der Code den Access erzeugt suboptimal und unübersichtlich ist würde ich nicht die Syntax verdammen.

SQL-Code:
SELECT
    VTP_TABDOS.CODDOS, VTP_TABBRE.IDEPAY, VTP_TABEVE.CODEVE, VTP_TABSUI.DATECH
FROM
    VTP_TABDOS
        join VTP_TABBRE on VTP_TABBRE.IDEDOS = VTP_TABDOS.IDEDOS
            join VTP_TABSUI on VTP_TABSUI.IDEDOS = VTP_TABBRE.IDEBRE
                join join VTP_TABEVE on VTP_TABEVE.IDEEVE = VTP_TABSUI.IDEECH
            join VTP_TABPAY on VTP_TABPAY.IDEPAY = VTP_TABBRE.IDEPAY;

p80286 7. Aug 2009 12:39

Re: [SQL] Hilfe bei Verknüpfung zweier Tabellen
 
Zitat:

Zitat von mkinzler
Nur weil der Code den Access erzeugt suboptimal und unübersichtlich ist würde ich nicht die Syntax verdammen.

ist zwar ein alter Hut, aber was war ist ...

Nur, bei den Beispielen fällt es schwer eine andere Syntax zu akzeptieren.

SQL-Code:
SELECT
    VTP_TABDOS.CODDOS, VTP_TABBRE.IDEPAY, VTP_TABEVE.CODEVE, VTP_TABSUI.DATECH
FROM
    VTP_TABDOS
        join VTP_TABBRE on VTP_TABBRE.IDEDOS = VTP_TABDOS.IDEDOS
            join VTP_TABSUI on VTP_TABSUI.IDEDOS = VTP_TABBRE.IDEBRE
                join join VTP_TABEVE on VTP_TABEVE.IDEEVE = VTP_TABSUI.IDEECH
            join VTP_TABPAY on VTP_TABPAY.IDEPAY = VTP_TABBRE.IDEPAY;
könnte man dies in eine solche Allgemeinform überführen:

SQL-Code:
...
FROM tabelle1
     JOIN tabelle2 ON tabelle2.spa = tabellex.spy
     JOIN tabelle3 ON tabelle3.spa = ...
...
und um NULL-Werte zu beachten


SQL-Code:
FROM Tabelle1,Tabelle2,Tabelle3
WHERE Tabelle1.id0 = Tabelle2.id0
  AND Tabelle1.ID1 = Tabelle3.id1(+)


FROM Tabelle1
     JOIN Tabelle2 ON Tabelle1.id0 = Tabelle2.id0
     LEFT JOIN Tabelle3 ON Tabelle3.id1=Tabelle1.id1
oder
     RIGHT JOIN Tabelle3 ON Tabelle1.id1 = Tabelle3.id1
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr.

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