AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Join funktioniert nicht

Ein Thema von hschmid67 · begonnen am 14. Sep 2017 · letzter Beitrag vom 14. Sep 2017
Antwort Antwort
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
71 Beiträge
 
Delphi 12 Athens
 
#1

Join funktioniert nicht

  Alt 14. Sep 2017, 12:07
Datenbank: MariaDB • Version: 10.1.23 • Zugriff über: MyDAC oder dbForge
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
Harald Schmid
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Join funktioniert nicht

  Alt 14. Sep 2017, 12:17
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);
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: Join funktioniert nicht

  Alt 14. Sep 2017, 13:07
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.
  Mit Zitat antworten Zitat
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
71 Beiträge
 
Delphi 12 Athens
 
#4

AW: Join funktioniert nicht

  Alt 14. Sep 2017, 16:19
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
Harald Schmid
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Join funktioniert nicht

  Alt 14. Sep 2017, 17:05
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
Gruß, Jo

Geändert von jobo (14. Sep 2017 um 17:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 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