SQL mit Outerjoin

Aufgrund von Suchkriterien(Keywords), die ein User eingibt, wird ein Query generiert. Solange in der Where-Clause nicht in der Tabelle vsns_unterrubrik gesucht wird, funktioniert dieser Query ohne Probleme. Sobald jedoch die Tabelle vsns_unterrubrik nach den Keywords durchsucht wird, bringt der Query alle Einträge zurück.

Bitte beachte, dass die Tabelle vsns_unterrubrik über einen Outerjoin angesprochen wird

SELECT vsns_zeitung.vsns_zeitung_id
, vsns_hauptrubrik.vsns_descn AS hauptrubrik
, vsns_unterrubrik.vsns_descn AS unterrubrik
, vsns_zeitung.vsns_ersch_date
, vsns_zeitung.vsns_ausgabe
, vsns_zeitung.vsns_eintrag
FROM vsns_zeitung
, vsns_hauptrubrik
, vsns_unterrubrik
WHERE vsns_zeitung.vsns_hauptrubrik_id =
vsns_hauptrubrik.vsns_hauptrubrik_id
AND vsns_zeitung.vsns_unterrubrik_id *= vsns_unterrubrik.vsns_unterrubrik_id
AND (( vsns_zeitung.vsns_keyword LIKE
‚%Informatik%‘ )
OR ( vsns_zeitung.vsns_eintrag LIKE ‚%Informatik%‘ )
OR ( vsns_unterrubrik.vsns_descn LIKE ‚%Informatik%‘ )
OR (
vsns_hauptrubrik.vsns_descn LIKE ‚%Informatik%‘ ))

ORDER BY vsns_hauptrubrik.vsns_descn
, vsns_unterrubrik.vsns_descn
, vsns_zeitung.vsns_eintrag;

das problem ist ganz einfach: der outer-join ist in diesem fall absolut fehl am platz. zur erinnerung: was macht der outer-join?

ein outer-join verbindet zwei tabellen, wobei der fremdschlüssel der einen tabelle als primärschlüssel in der zweiten tabelle gesucht wird. wird dieser schlüssel nicht gefunden, wird ein dummy-datensatz erzeugt (alle felder null) und „ehrenhalber“ als trefferergebnis gewertet. damit werden auch jene datensätze der ersten tabelle gefunden, deren fremdschlüssel nicht in der zweiten tabelle vorkommt.

  • also genau dass, was bei dir der fall ist. eigentlich willst du ja ein anderes ergebnis haben: du willst alle zeitungen, die entweder im keyword oder im eintrag das wort „informatik“ haben sollen. zusätzlich sollen alle zeitungen gefunden werden, die mit einer hauptrubrik verbunden sind, die das selbe wort beinhalten. weiters sollen auch jene zeitungen gefunden werden, die mit einer unterrubrik verbunden sind, die ebenfalls das wort „informatik“ beinhaltet. eigentlich eine klassische union:

select …
from zeitung
where zeitung.keyword like ‚%informatik‘
or zeitung.eintrag like ‚%informatik‘
union
select …
from zeitung, hauptrubrik
where zeitung.hauptrubrikid = hauptrubrik.id
and hauptrubrik.eintrag like ‚%informatik‘
union
select …
from zeitung, unterrubrik
where zeitung.unterrubrikid = unterrubrik.id
and unterrubrik.eintrag like ‚%informatik‘
;

logischer einwand: das ganze sieht etwas hässlich aus. ist aber egal, solange es funktioniert. und wegen der performance brauchst du dir keine sorgen machen - sobald ein „or“ in der where-clause vorkommt, muss die db-engine sowieso eine union machen. nur das ursprüngliche mörder-statement ist viel komplizierter, braucht länger zum parsen und wird meiner meinung nach mindestens genausolange zum abarbeiten brauchen.

probiers einfach aus

erwin rockenbauer

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke…
Hat wunderbar funktioniert. wegen der performance muss du dir keine sorgen machen, da diese Applikation übers Internet läuft.

cu
Patrik