SQL Abfrage mit 3 Selects vereinfachen

Hallo,

ich bin noch nicht so erfahren was SQL angeht aber ich habe eine Abfrage geschrieben welche auch wunderbar funktioniert. Nur leider ist diese extrem langsam da sich in der Abfrage drei ineinander geschachtelte selects befinden. Mit einem Join wäre das wahrscheinlich um vieles einfacher nur verstehe ich das mit den joins einfach nicht.

Hier mal die Abfrage:

SELECT ADDRESS.Firma,
FROM ADDRESS
WHERE ADDRESS.UID IN
( SELECT UID2 FROM RELATIONS
WHERE UID1 IN (
select document.uid from document where document.titel like ‚%Angebot%‘
)
)

Danke schonmal

Gruß

Michael

Hi Michael,

meinst du in etwa so was (ungetestet, war deins aber mit SIcherheit auch :wink: :

SELECT 
 distinct ADDRESS.Firma
FROM 
 ADDRESS
 ,RELATIONS
 ,DOCUMENT
WHERE
 ADDRESS.UID = RELATIONS.UID2
 AND DOCUMENT.UID = RELATIONS.UID1
 AND DOCUMENT.TITEL like '%Angebot%';

gruss
bernhard

Moin, Michael,

wer behauptet denn, dass geschachtelte Selects langsam sind? Wenn die Tabellen recht groß und nicht indiziert sind, dann läuft jedes Konstrukt zäh.

Ein Join ist das Kreuzprodukt aus 2 (oder mehr) Tabellen. Durch passende Where-Klauseln werden die gewünschten Teilmengen aus dem gesamten Kreuzprodukt gefiltert. Das kann, wenn es blöd geht, länger dauern als jede Schachtelung.

Gruß Ralf

hallo

welche datenbank macht bei einem normalen join ein kreuzprodukt??? also, wenn unsere db mit mehreren millionen zeilen sowas tun würde, würde der betrieb nur mehr stehen und nix mehr gehen. relationale datenbanken sind ja gerade auf joins hin optimiert (desshalb heissen sie ja auch so!).

gut möglich, dass irgendeine hinterwäldler-freeware-db tatsächlich so einen blödsinn macht, professionelle datenbanken sicher nicht.

aber insofern hast du recht: bei modernen datenbanken ist es irrelevant, ob man subselects oder joins nimmt: der optimizer erkennt beide varianten und führt intern die selben aktionen durch.

lg
erwin

Moin, Erwin,

aber insofern hast du recht: bei modernen datenbanken ist es
irrelevant, ob man subselects oder joins nimmt: der optimizer
erkennt beide varianten und führt intern die selben aktionen
durch.

alle Optimizer sind für Indizes dankbar, auch die der „modernen“ Datenbanken.

Gruß Ralf

Hi Bernhard,

ja vielen Dank hat geklappt. Ich dachte zwar ein einen INNER JOIN aber so läuft sie auch recht schnell.

Nochmals Danke.

Gruß

Michael