SQL Left Join mit Bedingung
Danilo
- datenbank
0 Frank (no reg)0 Danilo0 Danilo0 Frank (no reg)0 Danilo0 Frank (no reg)0 Danilo
0 Ilja
Hallo
Ich versuche bei mir ein Left Join mit Bedingung zu machen. Naja, vielleicht geht das ja gar nicht, das Problem ist jedenfalls folgendes:
Ich habe eine Tabelle mit Fragen und eine mit Antworten. Zu jeder Antwort gibt es eine User-ID. Die Antworten werden jetzt per Left Join mit den Fragen verknüpft, aber sollten eigentlich nur verknüpft werden wenn die User-ID der Antwort mit einem bestimmten Wert übereinstimmt. Sonst sollte das Antwort-Feld leer bleiben.
Wenn ich am Ende des Queries eine WHERE-Bedingung einfüge wird diese auf das ganze Query angewendet, und ich erhalte nur noch die Fragen bei denen der gewählte User eine Antwort hinzugefügt hat. Es sollten aber auf jeden Fall alle Fragen enthalten sein, darum ja ein Left Join.
Weiss jemand Rat?
Ich verwende (unfreiwillig) eine Access-Datenbank, hier das gesamte Query:
SELECT Fragen.id AS id, Fragen.frage AS fragetext, Kategorien.kategorie, Antworten.antwort
FROM Antworten RIGHT JOIN (Fragen INNER JOIN Kategorien ON Fragen.kategorie_id = Kategorien.id) ON Antworten.frage_id = Fragen.id
WHERE Kategorien.kategorie = 'fachwissen'
ORDER BY Fragen.id ASC
Danke im Voraus für die Antworten.
Hi,
ich lese erst Left Join, dann RIGHT JOIN ... was von beiden möchtest du jetzt?
Meine Empfehlung, fange nicht von Antworten an, sondern von den Fragen. Du kannst auch mehrere JOIN Bedingungen verwenden indem du sie einfach mit AND verknüpfst, genauso wie in einer WHERE Klausel.
Das Problem mit der bestimmten User ID kannst du mit einem CASE WHEN ... THEN ELSE ... END Konstrukt zwischen SELECT und FROM lösen.
Ciao, Frank
Hi,
ich lese erst Left Join, dann RIGHT JOIN ... was von beiden möchtest du jetzt?
Meine Empfehlung, fange nicht von Antworten an, sondern von den Fragen. Du kannst auch mehrere JOIN Bedingungen verwenden indem du sie einfach mit AND verknüpfst, genauso wie in einer WHERE Klausel.
Das Problem mit der bestimmten User ID kannst du mit einem CASE WHEN ... THEN ELSE ... END Konstrukt zwischen SELECT und FROM lösen.
Ciao, Frank
Hi
Entschuldige das mit dem Left Join, war natürlich Right Join gemeint :)
Das Problem mit den mehreren Joins ist vor allem dass Access seine etwas eigene Syntax hat. CASE WHEN funktioniert da nicht. Ich habe allerdings mit IIf etwas gefunden das eventuell funktionieren könnte... (http://www.techonthenet.com/access/functions/advanced/iif.php)
Werde es mal versuchen und bescheidsagen falls es funktioniert. Danke für deine Antwort.
Okay, Access kennt IIF ... sollte dir auch helfen.
Aber nochmal der Tipp: LEFT JOIN von der Fragen-Tabelle aus, sollte dir dein leben einfacher machen.
Gruss, Frank
Hm, ich kriegs einfach nicht hin. Werde mal die Situation schildern, vielleicht weiss jemand Rat.
----------------------------------------
| Fragen |
----------------------------------------
| id | kategorie_id | frage |
----------------------------------------
| 1 | 4 | wer ist tux? |
| 2 | 4 | wie heisst tux? |
| 3 | 4 | wo wohnt tux? |
| 4 | 4 | wie alt ist tux? |
| 5 | 5 | was macht tux? |
----------------------------------------
-------------------
| Kategorien |
-------------------
| id | kategorie |
| 4 | fachwissen |
| 5 | logik |
-------------------
-------------------------------------------------
| Antworten |
-------------------------------------------------
| antwort_id | kandidat_id | frage_id | antwort |
-------------------------------------------------
| 1 | 24 | 1 | foo |
| 2 | 24 | 3 | bar |
| 3 | 24 | 4 | blub |
| 4 | 20 | 4 | blob |
-------------------------------------------------
Was mir das Query jetzt ausgeben sollte ist eine Liste von allen Fragen der Kategorie "fachwissen", und wenn der Kandidat 24 die Frage beantwortet hat soll diese auch ausgegeben werden. Wenn die Antwort von Kandidat 20 kommt, oder nicht benatwortet wurde, sollte das Antwort-Feld leer bleiben.
Wie kann ich das Query am besten gestalten?
SELECT deineWunschFeld1, deineWunschFeld2 -- usw.
FROM Fragen f
INNER JOIN Kategorien k -- dieser JOIN ist nicht unbedingt notwendig, wenn du nicht unbedingt mit dem Kategorienamen in der WHERE Klausel schaffen willst
ON f.Kategorie_Id = k.Id
LEFT JOIN Antworten a ON -- alle Fragen aber nicht alle Antworten
ON a.Frage_Id = f.Id
AND a.KandidatId = 24 -- es werden nur Antworten von Kandidat 24 berücksichtigt
WHERE k.Id = 4
ORDER BY deineWunschFeld1 -- oder was auch immer du da brauchst
Da brauchts eigentlich auch nicht mal n IIF :)
Ciao, Frank
Danke für deine Antwort. Nachdem ich das für Access umgeschrieben habe funktioniert das Ganze leider nicht mehr.
Hier mein SQL Query, angepasst an die Datenbanksituation:
SELECT Fragen.id AS id, Fragen.gewichtung, Fragen.frage AS fragetext, Kategorien.kategorie, Fragen.antworttyp, Fragen.antwortmoeglichkeiten, Antworten.antwort
FROM (Fragen INNER JOIN Kategorien ON Fragen.Kategorie_id = Kategorien.id) LEFT JOIN Antworten ON Antworten.Frage_Id = Fragen.id AND a.Kandidat_Id = 24
WHERE Fragen.kategorie_id = 2
Lasse ich den Teil "AND a.Kandidat_Id = 24"
weg, funktioniert es. Gibt es das in Access wirklich nicht oder kann man das irgendwie umschreiben?
Gruss, Danilo
Ich sehe nirgendwo "a" definiert? Wenn du es mit "Antworten" ersetzt sollte es wieder gehen? ;)
Nachdem ich das für Access umgeschrieben habe
Siehste, haste wohl ein bisschen zuviel umgeschrieben. Nämlich die ganzen Tabellen-Aliase rausgelöscht und einen vergessen.
Ciao, Frank
Hi
Ich sehe nirgendwo "a" definiert? Wenn du es mit "Antworten" ersetzt sollte es wieder gehen? ;)
Whoops, hab ich wohl übersehen. Funktioniert aber auch in korrigiertem Zustand nicht, Access meldet mir "Verknüpfungsausdruck nicht unterstützt". Auch mit "AND 1=1" funktionierts nicht.
Hier hats jedenfalls jemand geschafft, also Access sollte das grundsätzlich können. Ich kapiere nicht wieso das nicht funktioniert...
yo,
Hm, ich kriegs einfach nicht hin. Werde mal die Situation schildern, vielleicht weiss jemand Rat.
warum befolgst du nicht einfach den rat mit dem LEFT JOIN ?
SELECT spalte1, spalte2...
FROM fragen f
INNER JOIN kategorien k ON k.id = f.kategorie_id
LEFT JOIN antworten a ON a.frage_id = f.id AND a.kandidat_id = 24
;