Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SELECT in SELECT (https://www.delphipraxis.net/42157-select-select.html)

Gruber_Hans_12345 14. Mär 2005 18:15

Datenbank: Firebird • Version: 1.5 • Zugriff über: IBConsole

SELECT in SELECT
 
Kann ich so eine Anfrage erstellen ?

SQL-Code:
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
Oder muß ich immer :
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

alcaeus 14. Mär 2005 18:40

Re: SELECT in SELECT
 
Hallo Hans,

hast du es denn schon probiert? AFAIR geht das naemlich durchaus (wenigstens in Oracle)

Greetz
alcaeus

omata 14. Mär 2005 22:36

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:
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
MfG
Thorsten

Gruber_Hans_12345 15. Mär 2005 07:36

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.

jim_raynor 15. Mär 2005 07:44

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 ...

Stevie 15. Mär 2005 07:57

Re: SELECT in SELECT
 
Warum immer so kompliziert, wenn es auch einfach geht??
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
MfG
Stevie

Robert_G 15. Mär 2005 08:02

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. ;)

Stevie 15. Mär 2005 08:04

Re: SELECT in SELECT
 
Zitat:

Zitat von Robert_G
Genau! Ich habe mich schon seit gestern gefrat, wann jemand auftaucht, der nicht JOIN-versaut ist. :mrgreen:

Ich HASSE JOIN!!! :twisted: :mrgreen:

jim_raynor 15. Mär 2005 08:13

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:
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
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:

Delphi-Quellcode:
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
Und falls er es doch optimiert und sich die Ergebnisse der Unterabfrage speichert, verstehe ich noch weniger, warum er die kurze Variante nicht versteht.

Bei Erstellung des Query Plan steckt bereits so viel Logik und Tricks hinter, warum nicht dabei ... Naja. Das werden nur die Hersteller wissen.

Gruber_Hans_12345 15. Mär 2005 12:02

Re: SELECT in SELECT
 
Zitat:

Zitat von Stevie
Warum immer so kompliziert, wenn es auch einfach geht??
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
MfG
Stevie

und wie mache ich dann so etwas ? (Wenn in der Lager Tabelle kein Eintrag zu dem Artikel existiert, wird dieser nicht berücksichtigt !)

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 04:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz