AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen
Thema durchsuchen
Ansicht
Themen-Optionen

Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen

Ein Thema von hsg · begonnen am 20. Jun 2017 · letzter Beitrag vom 21. Jun 2017
Antwort Antwort
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#1

Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen

  Alt 20. Jun 2017, 14:20
Datenbank: Oracle • Version: 10G R2 • Zugriff über: SQL
Hallo,
ich kämpfe gerade mit einem etwas blöden SQL-Statement:
Code:
select kp.vorgangs_nr as "VGNR1",
       kp.artikel_nr as "ArtikelNr",
       kp.bestaetigter_termin as "Bestaetigter Termin 1",
       (select sum(menge)
          from (           
                 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.artikel_nr = kp.artikel_nr
                   and ek.bestaetigter_termin < kp.bestaetigter_termin
                   and 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.entnahme_termin_gre < kp.bestaetigter_termin
                   and sp.komponenten_artikel_nr = kp.artikel_nr */ 
                   and sp.rueckmelde_status between 1 and 3
            )
         ) as "Deckung"
  from pekp kp
Das Statement ist hier jetzt etwas vereinfacht: im innersten Block werden noch mehr Tabellen angezogen und deren Werte über "union all" zu einer Ergebnismenge vereint.
Das ganze dient als Berechnung des theoretischen Lagerbestandes des jeweiligen Artikels zum Zeitpunkt des bestätigten Liefertermines einer Bestellung.

Ich habe also quasi ein Subquery mit einem Subqery, dessen innerster Block von den Spaltenwerten des äußersten Selects abhängig ist.

Was leider in Oracle nicht geht (Ora-Fehler ORA-00904: "KP"."BESTAETIGER_TERMIN": ungültiger Bezeichner)

Natürlich könnte ich jetzt den innersten Block als Stored-Function schreiben, aber für eine einzige Abfrage, die nur alle paar Wochen von einem einzigen Mitarbeiter aufgerufen wird und sonst niemanden interessiert, ist mir das zu viel Aufwand in der Pflege (diese Funktion müsste in 9 Datenbereichen gepflegt werden).

Irgendwelche Alternativen?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen

  Alt 20. Jun 2017, 15:41
Also diese Art Subselects sind mir immer suspekt.
Wieso lagerst Du das nicht in die normale From Clause mit klassischen Joins usw.
Natürlich muss dann das Schlüsselfeld mit selektiert werden und gegrouped.

Ach und nochwas:
ist das ein Statement für einen Report (also viele Daten) oder für eine Einzeldarstelleung (also bspw per Auswahl Artikelnummer/ Vorgangsnummer)
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von smallie
smallie

Registriert seit: 8. Jan 2013
19 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen

  Alt 20. Jun 2017, 19:49
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."
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen

  Alt 20. Jun 2017, 23:04
SQL-Code:
                 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.artikel_nr = kp.artikel_nr
                   and ek.bestaetigter_termin < kp.bestaetigter_termin ---<< woher soll denn dieses Datum kommen? da ek=kp ist die Bedingung nie erfüllt???????
Gruß K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Oracle: Spaltenwert über 2 Ebenen in Subqueries durchreichen

  Alt 21. Jun 2017, 06:21
Also diese Art Subselects sind mir immer suspekt.
Wieso lagerst Du das nicht in die normale From Clause mit klassischen Joins usw.
Natürlich muss dann das Schlüsselfeld mit selektiert werden und gegrouped.

Ach und nochwas:
ist das ein Statement für einen Report (also viele Daten) oder für eine Einzeldarstelleung (also bspw per Auswahl Artikelnummer/ Vorgangsnummer)
Das Statement ist für einen Report gedacht, also viele Artikel und viele Bestelldaten, die gegeneinander geprüft werden müssen.

Allerdings ist mir dein Ansatz zur Lösung nicht ganz klar. Ich brauche zum Schluss zu jedem Artikel der Hauptauswahl (die dort natürlich noch durch zusätzliche Selektionen gefiltert werden) zum Zeitpunkt eines Einkaufsvorganges die theoretische Deckungsmenge, also die Summe aller Lagerzu- und abgänge aus verschiedenen anderen Objekten.

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.
An WITH hatte ich auch schon gedacht, habe allerdings noch keine Erfahrung damit gemacht. Dadurch hatte ich keine Idee, wie ich das Datum dort unterbringe, nun sehe ich etwas klarer und werde es mal ausprobieren.

SQL-Code:
                 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.artikel_nr = kp.artikel_nr
                   and ek.bestaetigter_termin < kp.bestaetigter_termin ---<< woher soll denn dieses Datum kommen? da ek=kp ist die Bedingung nie erfüllt???????
Gruß K-H
Nein, ek und kp sind zwar dieselbe Tabelle, aber unterschiedliche Datensätze daraus. Die EK-Sätze sind kurz gesprochen alle Bestellungen, die vor der zu untersuchenden Bestellung liegen.

Danke an alle für den bisherigen Input!

Edit: Habe es jetzt mit WITH gelöst bekommen. Nochmals Dank für den Hinweis!

Geändert von hsg (21. Jun 2017 um 07:15 Uhr) Grund: Problem wurde gelöst
  Mit Zitat antworten Zitat
Antwort Antwort


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