AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SELECT in SELECT

Ein Thema von Gruber_Hans_12345 · begonnen am 14. Mär 2005 · letzter Beitrag vom 18. Mär 2005
Antwort Antwort
Seite 1 von 2  1 2      
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

SELECT in SELECT

  Alt 14. Mär 2005, 19:15
Datenbank: Firebird • Version: 1.5 • Zugriff über: IBConsole
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
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#2

Re: SELECT in SELECT

  Alt 14. Mär 2005, 19:40
Hallo Hans,

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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: SELECT in SELECT

  Alt 14. Mär 2005, 23:36
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
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#4

Re: SELECT in SELECT

  Alt 15. Mär 2005, 08:36
@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.
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#5

Re: SELECT in SELECT

  Alt 15. Mär 2005, 08:44
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 ...
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.017 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: SELECT in SELECT

  Alt 15. Mär 2005, 08:57
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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: SELECT in SELECT

  Alt 15. Mär 2005, 09:02
@Stevie
Genau! Ich habe mich schon seit gestern gefrat, wann jemand auftaucht, der nicht JOIN-versaut ist.
@Jim
Warum sollte sich eine DB den Query plan kaputtmachen um dir die Ergebnisse des SELECT während des Filtern zu präsentieren?
Die SELECT Clause läuft natürlich immer NACH der WHERE Clause. Alles andere wäre Blödsinn.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.017 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

Re: SELECT in SELECT

  Alt 15. Mär 2005, 09:04
Zitat von Robert_G:
Genau! Ich habe mich schon seit gestern gefrat, wann jemand auftaucht, der nicht JOIN-versaut ist.
Ich HASSE JOIN!!!
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#9

Re: SELECT in SELECT

  Alt 15. Mär 2005, 09:13
[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?
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.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#10

Re: SELECT in SELECT

  Alt 15. Mär 2005, 13:02
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
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.
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