Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Oracle SQL Abfrage, äußerer Wert an inneren übergeben


annabert - Di 03.08.10 11:09
Titel: Oracle SQL Abfrage, äußerer Wert an inneren übergeben
Hallo,

bin Anfänger was SQL betrifft, und finde die Lösung nicht:
Ich möchte in einer einzelnen Abfrage aus zwei Tabellen (WORKCENTER, KALENDER) zu bestimmten Einträgen in der Tabelle WORKCENTER das Datum aus einer bestimmten Zeile in der Tabelle KALENDER - abhängig von dem Eintrag in WORKCENTER - holen. Beispiel:

Workcenter 1 hat ANZAHL_TAGE = 7: Aus KALENDER soll heute plus 7 Arbeitstage ausgegeben werden.
Workcenter 2 hat ANZAHL_TAGE = 12: Aus KALENDER soll heute plus 12 Arbeitstage ausgegeben werden.
...

Gewünschtes Ergebnis: (Numerischer Wert des heutigen Tages ist 14824)

WORKCENTER_ID MAX_KALENDER_TAG
1 14833
2 14840
...

Nur zum Verständnis der Zahlen: 14824 = numerischer Wert des heutigen Tages, + 7 = 14831, dazwischen liegt ein Wochenende, also plus 2.

Hatte mir das so vorgestellt:


SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
SELECT WORKCENTER.ID AS WORKCENTER_ID, MAX_KALENDER_TAG
FROM WORKCENTER,
    (SELECT MAX(TAG) AS MAX_KALENDER_TAG
     FROM (SELECT TAG
           FROM KALENDER
           WHERE TAG > TRUNC(TO_NUMBER(SYSDATE - TO_DATE('01.01.1970''DD.MM.YYYY')))
           WHERE KALENDER.ARBEITSTAG = 'J'
           ORDER BY KALENDER.TAG
          )
     WHERE ROWNUM <= WORKCENTER.ANZAHL_TAGE
    )
WHERE WORKCENTER.ID IN ( 12679)


Der Oracle SQL Developer bringt mir die Fehlermeldung dass WORKCENTER.ANZAHL_TAGE unbekannt ist, was auch einleuchtet, sofern die SELECT Abfragen von innen nach aussen abgehandelt werden (ist das so?). Könnt ihr mir vielleicht sagen wie die Abfrage aussehen muss?
Ich hoffe man versteht was ich vorhatte...

Gruß


annabert - Mi 04.08.10 10:41


SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
SELECT ID,       
       MAX_KAL_TAG
FROM (SELECT ROWNUM as KAL_ROWNUM,
             TAG AS MAX_KAL_TAG                  
      FROM (SELECT TAG
            FROM KALENDER
            WHERE TAG > TRUNC(TO_NUMBER(SYSDATE - TO_DATE('01.01.1970''DD.MM.YYYY')))
            AND KALENDER.ARBEITSTAG = 'J'
            ORDER BY KALENDER.TAG)             
      WHERE ROWNUM <= (SELECT MAX(ANZAHL_TAGE)
                       FROM WORKCENTER
                       WHERE ID IN (12679))
      )
INNER JOIN WORKCENTER
ON ANZAHL_TAGE = KAL_ROWNUM
WHERE ID IN (12679)

So funktionierts.