Subquery ersetzen

05/09/2008 - 12:49 von Volker Neurath | Report spam
Hallo zusammen,

muss schon wieder mal làstig fallen ;)

Ausgangsbasis is folgende Tabelle

tabelle_1

ID (PK)
Master
Vorg

Inhalt

ID Master Vorg
10000 10000 0
10001 10000 10000
10002 10000 10001
10003 10000 0
10004 10004 0
10005 10004 0
10006 10004 10005

Aufgabenstellung:

suche alle mit Projektangebot 10003 verbundenen Projektangebote

Meine bisherige Lösung:

SELECT tabelle_1.ID, tabelle_1.Master, tabelle_1.Vorg
FROM tabelle_1
WHERE tabelle_1.Master
IN (SELECT tabelle_1.Master FROM tabelle_1 WHERE ID003);

Das liefert mir

10000 10000 0
10001 10000 10000
10002 10000 10001
10003 10000 0

Woraus ich u.a. erkennen kann, dass 10003 ein 2. Channel sein muss, da
es keinen Vorgànger hat; die Query macht also genau das, was ich möchte.

Ich suche, rein interessehalber, nach einer Möglichkeit, das ohne
Subquery zu machen, finde aber keine Lösung.

Da eingeflochten die Frage:
wie sieht es eigentlich mit der Performance von Queries mit Subqueries
aus - die sollte doch eigentlich recht dürftig sein[1] - oder?

Any Ideas?

Volker

PS.: dass ich, bei konsequenter Fortführung der Tabelle, die Aufgabe
"Suche mir alle Vorgànger zu Angebot xy (anm.: so es denn welche hat)"
wohl nicht mir reinem SQL beantworten kann, ist mir auch klar
(wird aber wohl eine Aufgabenstellung sein, also mussich coden *seufz*)

[1] Zumindest ab einer signifikanten Anzahl Datensàtze...

Newsoffice.de - Die Onlinesoftware zum Lesen und Schreiben im Usenet
Die Signatur làßt sich nach belieben Anpassen ;-)
 

Lesen sie die antworten

#1 Josef Poetzl
05/09/2008 - 13:14 | Warnen spam
Hallo!

Volker Neurath schrieb:
[...]
Meine bisherige Lösung:

SELECT tabelle_1.ID, tabelle_1.Master, tabelle_1.Vorg
FROM tabelle_1
WHERE tabelle_1.Master
IN (SELECT tabelle_1.Master FROM tabelle_1 WHERE ID003);


[...]
Ich suche, rein interessehalber, nach einer Möglichkeit, das ohne
Subquery zu machen, finde aber keine Lösung.



Du könntest die Tabelle per Join verbinden.
SELECT T.ID, T.Master, T.Vorg
FROM
tabelle_1 T
INNER JOIN
tabelle_1 M
ON M.Master = T.Master
WHERE
M.ID = 10003

Ich schàtze aber, dass das den gleichen Ablaufplan wie deine
IN-Variante erzeugt.
(Kannst du dir über den Jet-Showplan ansehen)


Da eingeflochten die Frage:
wie sieht es eigentlich mit der Performance von Queries mit Subqueries
aus - die sollte doch eigentlich recht dürftig sein[1] - oder?



Das hàngt vom erzeugten Ablaufplan ab.

PS.: dass ich, bei konsequenter Fortführung der Tabelle, die Aufgabe
"Suche mir alle Vorgànger zu Angebot xy (anm.: so es denn welche hat)"
wohl nicht mir reinem SQL beantworten kann, ist mir auch klar
(wird aber wohl eine Aufgabenstellung sein, also mussich coden *seufz*)



Du könntest eventuell mit "nested set" Daten auswerten. (Ich bevorzuge
allerdings Schleifen statt nested set, muss aber anmerken, dass ich
solche Auswertungen nicht unter Jet durchführe und daher
SQL-Prozeduren bzw. SQL-Funktionen von DB-Servern nutzen kann.)
Wenn du nach "Stückliste" und àhnlichen Begriffen suchst, wirst du
bestimmt einige Ansàtze finden.

mfg
Josef

EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/

Ähnliche fragen