Hallo,
ich kämpfe gerade mit einem etwas blöden
SQL-Statement:
<schnipp>
Irgendwelche Alternativen?
Das sieht für mich nach WITH-Clause aus.
Damit lassen sich "im Vorübergehen" Unterabfragen mit Namen versehen, die sich im Weiteren wie eine Tabelle oder View ansprechen lassen.
Code:
with EKSP as
( select ek.artikel_nr as Artikel,
(ek.menge_soll - ek.menge_lager_ist - ek.menge_wareneingang_ist) as Menge,
ek.bestaetigter_termin as Datum
from pekp ek
where ek.vorgangs_art = 'BE'
and ek.bestellpositions_status < 6
union all
select sp.komponenten_artikel_nr as Artikel,
-1 * (sp.entnahme_menge - sp.entnahme_menge_ist) as Menge,
sp.entnahme_termin_gre as Datum
from pfsp sp
where sp.rueckmelde_status between 1 and 3
)
select kp.vorgangs_nr as "VGNR1",
kp.artikel_nr as "ArtikelNr",
kp.bestaetigter_termin as "Bestaetigter Termin 1",
sum(EKSP.menge)
from pekp kp, EKSP
where EKSP.datum < kp.bestaetigter_termin
and EKSP.artikel = kp.artikel_nr
group by kp.vorgangs_nr, kp.artikel_nr, kp.bestaetigter_termin
So ungefähr.
Mit dem Ansatz sollten sich auch die weiteren Subqueries bändigen lassen.
Mit mehreren Unterabfragen sieht die Syntax so aus:
Code:
with FOO as
( select some_fields from some_tables ),
BAR as
( select some_fields from some_other_tables ) -- kein Komma hier
select f.some_fields, b.some_fields -- erstes Statement muß select sein
from FOO f, BAR b
where f.some_id = b.some_id
Wenn die Unterabfragen mehrmals durchgenudelt werden müssten, ist die WITH-Clause auch um ein Hauseck schneller.
"There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors."