Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Join funktioniert nicht (https://www.delphipraxis.net/193840-join-funktioniert-nicht.html)

hschmid67 14. Sep 2017 11:07

Datenbank: MariaDB • Version: 10.1.23 • Zugriff über: MyDAC oder dbForge

Join funktioniert nicht
 
Hallo zusammen,

igentlich ist das ja auch ein reines Datenbankthema: Also, wenn's stört, einfach überlesen oder die Frage löschen.

Ich habe einen Knoten im Hirn. Ich habe das schon dutzenende, hunderte Male gemacht, und sehe meinen Fehler nicht.

MariaDB 10.1.23

Ich habe zwei einfache Tabellen, die über eine ID (Int) verbunden sind.

Nun suche ich nach einer bestimmten Nummer im Feld (apid) der einen Tabelle, oder im Feld (id_extern) der anderen Tabelle.

So funktioniert die Abfrage:

Code:
SELECT
  p.id
FROM
  persons p, users u
WHERE
  p.id = u.id_kdb AND
  ((u.id_extern = 33999) OR (p.apid = 33999))
Wenn ich das Ganze aber über einen Join mache (das mache ich meistens, weil ich es verständlicher finde), dann läuft die Abfrage und bringt sowohl im Delphi, als auch in meinem Datenbank-Tool dbForge eine ewig dauernde Abfrage ohne Ergebnis.

Code:
SELECT
  p.id
FROM
  persons p
  LEFT JOIN users u ON (p.id = u.id_kdb)
WHERE
  (u.id_extern = 33999) OR (p.apid = 33999)
Sieht jemand, was ich übersehe, oder woran könnte das liegen?

Viele Grüße
Harald

mkinzler 14. Sep 2017 11:17

AW: Join funktioniert nicht
 
SQL-Code:
SELECT
  p.id
FROM
  persons p
WHERE
  p.apid = 33999 or p.id in ( select id_kdb from users where id_extern = 33999);

nahpets 14. Sep 2017 12:07

AW: Join funktioniert nicht
 
Zitat:

Zitat von hschmid67 (Beitrag 1381125)
Code:
SELECT
  p.id
FROM
  persons p, users u
WHERE
  p.id = u.id_kdb AND
  ((u.id_extern = 33999) OR (p.apid = 33999))
Code:
SELECT
  p.id
FROM
  persons p
  LEFT JOIN users u ON (p.id = u.id_kdb)
WHERE
  (u.id_extern = 33999) OR (p.apid = 33999)

Das sind aber zwei durchaus unterschiedliche Abfragen.
Muss es wirklich Left Join sein? Also aus Person muss alles geliefert werden und wenn vorhanden auch Daten aus Users? (Dann wäre die erste Abfrage wohl falsch.)

Left Join siehe hier: https://www.w3schools.com/sql/sql_join_left.asp

Mal hier bitte unten die Grafiken betrachten, dann sollte schnell klar werden, was konkret benötigt wird: https://www.w3schools.com/sql/sql_join.asp

Ausgehend von Deiner ersten Abfrage würde' ich mal das Left weglassen.

hschmid67 14. Sep 2017 15:19

AW: Join funktioniert nicht
 
Vielen herzlichen Dank für die Antworten!
Ja, es sind tatsächlich unterschiedliche Anfragen, was vor allem am INNER JOIN bzw. LEFT JOIN liegt, und den brauche ich tatsächlich :-(

Es geht darum, alle mit der apid aus der einen Tabelle zu finden und auch noch solche, zu denen es eventuell in der zweiten Tabelle auch ein Datensatz vorkommt, was nicht unbedingt der gleich sein muss, aber kann.

Es sind also folgende Kombinationen denkbar:

p.apid = [gesuchter Wert oder irgendwas größer gleich 0, wenn u.id_extern gleich dem gesuchten Wert ist]
u.id_extern = [irgendwas, gesuchter Wert oder NULL, oder u hat gar keinen passenden Datensatz = NULL bei LEFT JOIN]

Seltsamerweise funktioniert der Join ganz ohne "Where", auch mit einer Bedingung, aber sobald ich die ODER-Suche einbaue, geht's ins Endlose...

So also geht's, ich bekomme ca. 15000 Datensätze

Code:
SELECT
  p.id
FROM
  persons p
  LEFT JOIN users u ON (p.id = u.id_kdb)
Viele Grüße
Harald

jobo 14. Sep 2017 16:05

AW: Join funktioniert nicht
 
Na da würde ich doch jeweils die Tabellen direkt auf die IDs filtern und die Einzelergebnise (left) joinen oder sogar outer joinen, wenn nötig bzw. möglich.

Falls einigermaßen passende Indizes vorliegen sollten die Einzelsuchen blitzschnell gehen und die dann wohl sehr kleine Ergebnismenge ganz easy (flott) zu joinen sein.

Code:
--pseudo
select * from
  (Select <Daten> from person where filter = Id) p (left|full outer) join
  (select <Daten> from users where filter = UId) u
  on p.id = u.id


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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