![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: IBConsole
SELECT in SELECT
Kann ich so eine Anfrage erstellen ?
SQL-Code:
Oder muß ich immer :
SELECT A.ID, (SELECT SUM(L.MENGE) FROM LAGER L WHERE L.ID = A.ID) AS LAGER_MENGE
FROM ARTIKEL A WHERE LAGER_MENGE > 0
SQL-Code:
SELECT A.ID, (SELECT SUM(L.MENGE) FROM LAGER L WHERE L.ID = A.ID) AS LAGER_MENGE
FROM ARTIKEL A WHERE (SELECT SUM(L.MENGE) FROM LAGER L WHERE L.ID = A.ID) > 0 |
Re: SELECT in SELECT
Hallo Hans,
hast du es denn schon probiert? AFAIR geht das naemlich durchaus (wenigstens in Oracle) Greetz alcaeus |
Re: SELECT in SELECT
Moin,
natürlich geht das, die Frage ist eher, ob das auch schnell geht. Wenn eine Abfrage im SELECT-Teil eingefügt wird, wird diese für jede Zeile einzeln durchgeführt. Dies ist dann relativ langsam. Besser und flexibler ist da die Verwendung eines LEFT JOINs. Bei dieser Vorgehensweise kann man mehr als einen Parameter erstellen und übergeben und man kann diese berechneten Felder auch mehrfach in der umgebenden SELECT-Anweisung verwenden (im SELECT-, WHERE-, GROUP BY-, HAVING-Teil) Also ist folgende Vorgehensweise wesentlich eleganter und schneller...
SQL-Code:
MfG
SELECT A.ID, L.LAGER_MENGE
FROM ARTIKEL A LEFT JOIN (SELECT ID, SUM(MENGE) AS LAGER_MENGE FROM LAGER) L ON A.ID = L.ID WHERE L.LAGER_MENGE > 0 Thorsten |
Re: SELECT in SELECT
@alcaeus:
Nein, es geht nicht, da ich sonst nicht gefragt hätte Fehler : Dynamic SQL Error SQL error code = -206 Column unknown LAGER_MENGE At line 3, column 7 @omata: Es geht leider nicht, und auch deine Anfrage funktioniert in Firebird 1.5 nicht, er kennt den SELECT in der LEFT OUTER JOIN nicht. |
Re: SELECT in SELECT
Solche Sachen sind leider von Datenbank zu Datenbank sehr unterschiedlich. Aber selbst Oracle schafft es nicht im Where auf benamte Felder aus der Auswahl zuzugreifen, was ich bis heute nicht verstehe und ich mich immer wieder ärgere ... Eventuell kannst du es mit einer View lösen. Die View ohne das Where aufbauen und dann bei der eigentlichen Abfrage auf die View zugreifen. Dann sollte es klappen. Ist zwar nicht schön, aber es müsste funktionieren :)
P.S: Ich hoffe doch mal, dass FireBird Views unterstützt ... |
Re: SELECT in SELECT
Warum immer so kompliziert, wenn es auch einfach geht??
SQL-Code:
MfG
SELECT a.ID, Sum(Menge) FROM Lager l, Artikel a
WHERE l.ID = a.ID GROUP BY a.ID HAVING Sum(Menge) > 0 Stevie |
Re: SELECT in SELECT
@Stevie
Genau! Ich habe mich schon seit gestern gefrat, wann jemand auftaucht, der nicht JOIN-versaut ist. :mrgreen: @Jim Warum sollte sich eine DB den Query plan kaputtmachen um dir die Ergebnisse des SELECT während des Filtern zu präsentieren? :gruebel: Die SELECT Clause läuft natürlich immer NACH der WHERE Clause. Alles andere wäre Blödsinn. ;) |
Re: SELECT in SELECT
Zitat:
|
Re: SELECT in SELECT
[quote="Robert_G@Jim
Warum sollte sich eine DB den Query plan kaputtmachen um dir die Ergebnisse des SELECT während des Filtern zu präsentieren? :gruebel: Die SELECT Clause läuft natürlich immer NACH der WHERE Clause. Alles andere wäre Blödsinn. ;)[/quote]Damit man selber weniger arbeit hat :) Aber daran hab ich nicht wirklich gedacht, klingt für mich aber plausibel ...
Delphi-Quellcode:
Aber mal ehrlich. Für mich sieht diese Variante danach aus, dass es er die Unterabfrage zweimal ausführt berechnet. Wenn ja, warum kann er dann nicht damit arbeiten:
SELECT A.ID, (SELECT SUM(L.MENGE) FROM LAGER L WHERE L.ID = A.ID) AS LAGER_MENGE
FROM ARTIKEL A WHERE (SELECT SUM(L.MENGE) FROM LAGER L WHERE L.ID = A.ID) > 0
Delphi-Quellcode:
Und falls er es doch optimiert und sich die Ergebnisse der Unterabfrage speichert, verstehe ich noch weniger, warum er die kurze Variante nicht versteht.
SELECT A.ID, (SELECT SUM(L.MENGE) FROM LAGER L WHERE L.ID = A.ID) AS LAGER_MENGE
FROM ARTIKEL A WHERE LAGER_MENGE > 0 Bei Erstellung des Query Plan steckt bereits so viel Logik und Tricks hinter, warum nicht dabei ... Naja. Das werden nur die Hersteller wissen. |
Re: SELECT in SELECT
Zitat:
SQL-Code:
SELECT a.ID, Sum(Menge) FROM Lager l, Artikel a
WHERE l.ID = a.ID GROUP BY a.ID HAVING Sum(Menge) = 0 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz