Laden...

Join Verständnisproblem

Erstellt von SunB vor 13 Jahren Letzter Beitrag vor 13 Jahren 856 Views
S
SunB Themenstarter:in
19 Beiträge seit 2005
vor 13 Jahren
Join Verständnisproblem

verwendetes Datenbanksystem: SQLite und MySQL

Hallo!

Ich habe eine Abfrage über 3 Tabellen gebastelt.

Tabellenstruktur:
mcd (Felder: sid, faname, tel1, .....)
ownap (Felder: sid, vorname, nachname, ...)
mcpap (Felder: sid, vorname, nachname, ...)

In den Tabellen ownap und mcpap sind Personen gespeichert die über das Feld sid mit den Einträgen in mcd verknüpft sind.

Ziel ist eine Abfrage aller Einträge in mcd zu denen es entweder Einträge in ownap gibt wo das Feld nachname einen bestimmten Text enthält oder das selbe in mcpap.

Folgenden Query habe ich gebastelt:

SELECT m.sid, faname
FROM mcd as m, ownap as o, mcpap as p
WHERE (m.sid = o.sid AND o.nachname like '%test%') OR
(m.sid = p.sid AND p.nachname LIKE '%test%') GROUP BY m.faname

Das funktioniert auch, allerdings würde ich gerne wissen wie man das mit einem Join eleganter löst. Leider habe ich es noch nicht geschafft das Prinzip von Joins zu behirnen. Kann mir bitte jemand weiterhelfen?

Vielen Dank, lg
Mike

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo SunB,

im Prinzip hast du ja einen JOIN in deiner Query, siehts es nur nicht.
Ein JOIN würde in deinem Fall so aussehen:
SELECT ... FROM mcd m JOIN ownap o ON m.sid = o.sid
wobei das JOIN folgendes ersetzt:
SELECT ... FROM mcd m, ownap o WHERE (m.sid = o.sid)
Dementsprechend kannst du in meiner oben genannten JOIN noch eine WHERE Klausel anhängen in der du deine LIKE Bedingung hast.

Dazu gibt es noch LEFT JOIN, RIGHT JOIN und FULL JOIN auf welche ich jetzt nicht darauf eingehen will und du in der Doku nachlesen kannst.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
SunB Themenstarter:in
19 Beiträge seit 2005
vor 13 Jahren

Hallo Michael!

Danke für Deine Antwort.
Ein Join mit 2 Tabellen ist für mich noch verständlich. Aber wie würde das mit allen 3 Tables aussehen? Also vom Ergebnis her das Gleiche wie mein Query?

Vielen Dank
Mike

P.S.: Ich wohne auch da wo andere Urlaub machen zwinker

1.552 Beiträge seit 2010
vor 13 Jahren

Du kannst die JOINS natürlich auch erweitern. Die allgemeine Syntax lautet hierbei
t1 JOIN t2 ON bedingung JOIN t3 on bedingung
in deinem Fall also
SELECT ... FROM mcd m JOIN ownap o ON m.sid = o.sid JOIN mcpap p ON m.sid = p.sid
Anmerkend sei dabei gesagt dass die JOIN Anordnung eine performante Rolle spielt. Allgemein ist es m.E. besser von großen auf kleine Tabellen zu joinen.

P.S.: Ich wohne auch da wo andere Urlaub machen zwinker

gut so 😁

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
SunB Themenstarter:in
19 Beiträge seit 2005
vor 13 Jahren

Wenn ich also meinen ursprünglichen Query mit Joins realisieren möchte, müsste das so aussehen:

SELECT mcd.sid, mcd.faname
FROM mcd
JOIN ownap ON mcd.sid=ownap.sid
JOIN mcpap ON mcd.sid=mcpap.sid
WHERE mcpap.nachname LIKE '%test%'
OR ownap.nachname LIKE '%test%'
GROUP BY mcd.faname

Leider bringt das keine Ergebnisse - Warum?

Danke nochmals!

1.552 Beiträge seit 2010
vor 13 Jahren

Müsste funktionieren,probier mal die WHERE wegzulassen, ich denke es wird dort der Fehler liegen

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

S
SunB Themenstarter:in
19 Beiträge seit 2005
vor 13 Jahren

Aha! Ich glaub das liegt an einem Logikproblem:

In der Tabelle mcd sind Firmen gespeichert.
In der Tabelle ownap sind Ansprechpartner gespeichert.
In der Tabelle mcpap sind auch Ansprechpartner gespeichert.
(Grund: unterschiedliche Herkunft der Ansprechpartner -> ich kann und will die nicht in einer Tabelle zusammenfassen)

Der User will jetzt Firmen nach Ansprechpartner suchen.
Das Problem ist dass ich die Firma X finden will egal ob der passende Ansprechpartner in einer der beiden Personentabellen oder in beiden vorhanden ist.

Würde der Join so wie ich ihn gemacht habe nicht voraussetzen dass der Ansprechpartner in beiden Tabellen (mcpap und ownap) vorhanden ist?

1.552 Beiträge seit 2010
vor 13 Jahren

Würde der Join so wie ich ihn gemacht habe nicht voraussetzen dass der Ansprechpartner in beiden Tabellen (mcpap und ownap) vorhanden ist?

Ja das täte er.
Dann denke ich mir wirst du wohl deine anfänglich gepostete Query benutzen sollen.
So auf die schnelle fällt mir auch nicht ein wie man es mit einer JOIN hinbekommen sollte oder ob es überhaupt möglich ist.

edit: Ich rate dir, falls möglich die Tabellennamenbezeichnung zu überdenken.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

du kannst ja ein Outer Join verwenden.

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

S
SunB Themenstarter:in
19 Beiträge seit 2005
vor 13 Jahren

Es gibt 2 Gründe warum ich das mit Join lösen wollte.

  1. Ich will endlich Joins kapieren und
  2. Habe ich das Phänomen, dass mein Query im SQL Client funktioniert, in meiner C# Anwendung aber interessanterweise nicht (hängt im Timeout bzw. friert ein (andere Queries funktionieren aber wunderbar)).

Naja ... muss ich wohl versuchen das Problem anders zu lösen.

Danke Euch beiden!

F
155 Beiträge seit 2009
vor 13 Jahren

Hallo,

du kannst auch zwei getrennte Abfragen machen und diese mit UNION verbinden:



SELECT mcd.sid, mcd.faname 
FROM mcd 
JOIN ownap ON mcd.sid=ownap.sid
WHERE ownap.nachname LIKE '%test%'

UNION

SELECT mcd.sid, mcd.faname 
FROM mcd 
JOIN mcpap ON mcd.sid=mcpap.sid 
WHERE mcpap.nachname LIKE '%test%' 


P.S.: Ich wohne auch da wo andere Urlaub machen zwinker

fz

"We better hurry up and start coding, there are going to be a lot of bugs to fix."

S
SunB Themenstarter:in
19 Beiträge seit 2005
vor 13 Jahren

Hallo,

du kannst auch zwei getrennte Abfragen machen und diese mit UNION verbinden:

  
  
SELECT mcd.sid, mcd.faname   
FROM mcd   
JOIN ownap ON mcd.sid=ownap.sid  
WHERE ownap.nachname LIKE '%test%'  
  
UNION  
  
SELECT mcd.sid, mcd.faname   
FROM mcd   
JOIN mcpap ON mcd.sid=mcpap.sid   
WHERE mcpap.nachname LIKE '%test%'   
  
  

Hier lernt man direkt noch was 😉
Die Lösung funktioniert super.

Vielen Dank!