Problem mit Left Join in Oracle
Markus Kriegl
- datenbank
Hallo!
Ich habe in Oracle 9 ein Problem mit einem LeftJoin
Es gibt 2 Tabellen eine Job in der Stellenangebote gespeichert sind und eine Jobkategorie in der die einzelnen Jobbereiche gespeichert sind. Nun will ich zu Überprüfungszwecken eine Abfrage schreiben die mir alle Jobs liefert auch wenn der Bereich inzwischen gelöscht wurde und sie auf einen leeren Bereich referenzieren. Ich weiss es soll sowas nicht vorkommen, aber es geht hierbei ja auch um eine reine Sicherheitsabfrage. Jedenfalls habe ich folgende Abfrage (da ich noch ein Sprachattribut mitprüfen muss.
select * from job j, jobkategorie jk where j.oid_job_kategorie = jk.oid(+) and jk.ch_language='de'
Dieser Leftjoin funktioniert leider nicht es wird implizit ein natural join gemacht was offensichtlich an dem and und dem 2. statement liegt.
Hat jemand vielleicht eine Idee für die Lösung ?
Mfg, Markus
Hallo Markus.
Du hast recht, dass das an dem Statement mit der Sprache liegt.
Die Lösung ist ein bissel knifflig, aber trotzdem möglich.
Du musst in der from-Klausel anstelle der Jobkategorie selbst ein select einsetzen,
in dem du die jobkategorie bereits nach der Sprache selektiert hast. Sieht dann so aus:
select *
from job j, (select * from jobkategorie where language = 'de) jk
Where j.oid_job_kategorie = jk.oid(+);
MfG Mero
Hallo Markus.
Du hast recht, dass das an dem Statement mit der Sprache liegt.
Die Lösung ist ein bissel knifflig, aber trotzdem möglich.Du musst in der from-Klausel anstelle der Jobkategorie selbst ein select einsetzen,
in dem du die jobkategorie bereits nach der Sprache selektiert hast. Sieht dann so aus:select *
from job j, (select * from jobkategorie where language = 'de) jk
Where j.oid_job_kategorie = jk.oid(+);MfG Mero
Hab ein ' hinter dem "de" vergessen.
Richtig ist natürlich
select *
from job j, (select * from jobkategorie where language = 'de') jk
Where j.oid_job_kategorie = jk.oid(+);
Danke für die Hilfe!
Diese Schwachstelle könnten die von Oracle ruhig ausbessern;)
mfg, Markus
yo,
select * from job j, jobkategorie jk where j.oid_job_kategorie = jk.oid(+) and jk.ch_language='de'
das kann auch nicht funkionieren und das liegt nicht an oracle. zum einen suchst du jobangebote ohne gruppen, sprich du hast meiner meinung nach den OUTER JOIN an der falschen tabelle gesetzt. das plus müsste auf die seite der job tabelle.
und dann wird auch klar, dass die gesuchten datensätze niemals einen inhalt der zweiten tabelle haben können. insofern kannst du dir das abfragen nach 'de' sparen.
Dieser Leftjoin funktioniert leider nicht es wird implizit ein natural join gemacht was offensichtlich an dem and und dem 2. statement liegt.
ein NATURAL JOIN ist ein join über ALLE spalten, die den exakt den gleichen spaltennamen haben. bist du dir sicher, dass du das damit meinst und nicht einen INNER JOIN ?
Hat jemand vielleicht eine Idee für die Lösung ?
select *
from job j, jobkategorie jk
where j.oid_job_kategorie(+) = jk.oid
and jk.ch_language IS NULL
das sollte dir alle jobangebote ausliefern, die keine gruppierung mehr haben. oder aber ich habe dein posting ganz falsch verstanden.
Ilja
yo,
das kann auch nicht funkionieren und das liegt nicht an oracle. zum einen suchst du jobangebote ohne gruppen, sprich du hast meiner meinung nach den OUTER JOIN an der falschen tabelle gesetzt. das plus müsste auf die seite der job tabelle.
das ist quatsch, war schon an der richtigen stelle. seit oracle 9+ kann man eben auch die standard OUTER JOIN klausel benutzen und die leigt mir ganz offensichtlich mehr als das setzen des (+) operators.....
select *
from job j, jobkategorie jk
where j.oid_job_kategorie = jk.oid(+)
and jk.ch_language IS NULL
Ilja
?? yo,
??
?? ?? das kann auch nicht funkionieren und das liegt nicht an oracle. zum einen suchst du jobangebote ohne gruppen, sprich du hast meiner meinung nach den OUTER JOIN an der falschen tabelle gesetzt. das plus müsste auf die seite der job tabelle.
??
?? das ist quatsch, war schon an der richtigen stelle. seit oracle 9+ kann man eben auch die standard OUTER JOIN klausel benutzen und die leigt mir ganz offensichtlich mehr als das setzen des (+) operators.....
??
?? select *
?? from job j, jobkategorie jk
?? where j.oid_job_kategorie = jk.oid(+)
?? and jk.ch_language IS NULL
??
?? Ilja
Ich glaube, da hast du was durcheinander geworfen. Er will doch nicht nur die Jobs haben, die keiner gültigen jobkategorie zugeordnet sind, sondern alle Jobs. Sowohl die mit nicht mehr vorhandener jobkategorie, als auch die mit vorhandener jobkategorie, aber für diese eben nur die, bei denen die Sprache der jobkategorie de ist.
MfG Mero
yo,
Ich glaube, da hast du was durcheinander geworfen. Er will doch nicht nur die Jobs haben, die keiner gültigen jobkategorie zugeordnet sind, sondern alle Jobs. Sowohl die mit nicht mehr vorhandener jobkategorie, als auch die mit vorhandener jobkategorie, aber für diese eben nur die, bei denen die Sprache der jobkategorie de ist.
ich muss zugeben, meine beiträge zu diesem beitrag sind nicht gerade die besten. aber zum glück ist nicht alles falsch. das problem liegt nicht an orakel. wenn man die zweite tabelle nach einem wert in der WHERE klausel wie 'de' abfragt, dann kann man nicht die datensätze erhalten, die dort nur NULL werte besitzen.
will er nun alle datensatze von job, die in der jobkategorie ein 'de' eintrag haben UND alle datensätze, die keinen eintrag haben, dann muss man meine eine abfrage nach den NULL werten mit union einer zweiten abfrage mit einem INNER JOIN kombieren.
ich habe mir noch mal deine lösung angeschaut. und diese gibt auch datensätze der job tabelle wieder, die eigentlich einen anderen eintrag als 'de' in der zweiten tabelle haben, allerdings mit NULL werten aufgefüllt. vielleicht verstehe ich ja immer noch nicht, was genau er haben will. aber wenn mich nicht alles täuscht, dann alle job-datensätze mit 'de' in der zweiten tabelle und alle die keine gültige refernez mehr haben. deine abfrage solte zuviele datensätze liefern.
(
select spalten
from job j, jobkategorie jk
where j.oid_job_kategorie = jk.oid(+)
and jk.oid IS NULL
)
UNION
(
SELECT spalten
FROM job j, jobkategorie jk
WHERE j.oid_job_kategorie = jk.oid
AND jk.ch_language = 'de'
)
hinweis, die auszugebenen spalten müssen bei UNION gleich sein. so nun hoffe ich aber, dass ich diesmal meinen kopf eingeschaltet hatte....
Ilja