Sven Jacobs: Subselect

Hallo!
Ist es nicht möglich, in einem Subselect auf die Werte des äußeren Selects zuzugreifen?

SELECT blub1, innen.blub2
FROM tabelle1 aussen,
  (SELECT blub2
   FROM tabelle2
   WHERE blub3 = aussen.blub1) innen

Bekomme da immer in dem inneren Select bei aussen.blub1 "Ungültiger Spaltenname". Ist eine Oracle 8i Datenbank.

Vielen Dank!

  1. Hi,

    welche Fehlermeldung bekommst Du, wenn Du fuer die Tabellen keine Aliasnamen verwendest?

    Gruss,
    Ludger

    1. welche Fehlermeldung bekommst Du, wenn Du fuer die Tabellen keine Aliasnamen verwendest?

      Ok, jetzt muss ich mein Beispiel etwas konkretisieren. Ich muss Aliasnamen verwenden, da das innere Select (entgegen meinem vorherigen Beispiel) auf die selbe Tabelle (und somit Spalten) wie das äussere Select zugreift, jedoch mit einer anderen Bedingung, die sich auf einen Wert des äusseren Selects bezieht:

      SELECT blub1, blub2, innen.blub2
      FROM tabelle aussen,
        (SELECT blub2
         FROM tabelle
         WHERE blub1 = aussen.blub1 - 1) innen

      Ohne Aliasname würde das innere Select auf seine eigene Spalte blub1 verweisen.

      1. Hi,

        SELECT blub1, blub2, innen.blub2
        FROM tabelle aussen,
          (SELECT blub2
           FROM tabelle
           WHERE blub1 = aussen.blub1 - 1) innen

        ist denn blub2 hier eindeutig?

        Gruss,
        Ludger

        1. SELECT blub1, blub2, innen.blub2
          FROM tabelle aussen,
            (SELECT blub2
             FROM tabelle
             WHERE blub1 = aussen.blub1 - 1) innen

          ist denn blub2 hier eindeutig?

          Nein, die Spalte ist weder ein PRIMARY KEY noch befindet sich ein UNIQUE Constraint darauf.

          1. Hi,

            Du multiplizierst die beiden Matrizen 'tabelle'. Ist das wirklich gewuenscht?

            SELECT blub1, blub2, innen.blub2
            FROM tabelle aussen,
              (SELECT blub2
               FROM tabelle
               WHERE blub1 = aussen.blub1 - 1) innen

            Ausserdem ist blub1 und blub2 nicht eindeutig.

            Gruss,
            Ludger

            1. Ausserdem ist blub1 und blub2 nicht eindeutig.

              Genau!

            2. Du multiplizierst die beiden Matrizen 'tabelle'. Ist das wirklich gewuenscht?

              Hups, habe die Antwort überlesen. Also hier mal ein Beispiel, vielleicht verdeutlicht dies mein Problem besser. Die Tabelle sieht folgendermaßen aus:

              JAHR | WERT
              -----------
              2003 |   80
              2004 |  100
              2005 |  200

              und ich brauche als Ergebniszeilen dies:

              JAHR | WERT | VERÄNDERUNG ZUM VORJAHR (IN %)
              --------------------------------------------
              2004 |  100 |  25
              2005 |  200 | 100

              1. Hi,

                was hat das ganze dann mit "innen", "außen" und "blub" zu tun? Das Problem krampfhaft zu pseudonomisieren gibt eigentlich nie Aufschluss über die Lösung sondern verhindert nur die Erkenntnis der tatsächlichen Zusammenhänge.

                Die Basis-Tabelle nenne ich mal "Jahres_Werte"

                SELECT t1.Jahr, t1.Wert, ((t1.Wert / t2.Wert)-1)*100 [Growth]
                FROM Jahres_Werte t1
                INNER JOIN Jahres_Werte t2
                ON t1.Jahr = (t2.Jahr - 1)

                Keine Ahnung im Moment, wie Oracle sich da verhält wenn ein integer durch den anderen dividiert wird (unter MS SQL kommen da immer abgeschnittene Integer [0 oder 1] raus) ... aber das kannst du sicher im PL/SQL Handbuch nachlesen, ebenso wie vielleicht eine etwas Oracle-spezifischere Syntax :-)

                HTH, Frank

  2. yo,

    Ist es nicht möglich, in einem Subselect auf die Werte des äußeren Selects zuzugreifen?

    das ist sehr wohl möglich und hört auf den klangvollen namen korrelierende abfragen.

    SELECT blub1, innen.blub2
    FROM tabelle1 aussen,
      (SELECT blub2
       FROM tabelle2
       WHERE blub3 = aussen.blub1) innen

    grundsätzlich solltest du vor jedem spaltennamen in einer korrelierende abfrage auch den aliasnamen einsetzen, falls es sich um tabellen gleichen names handelt. ansonsten würde auch der tabellenname gehen. es ersparrt einen die suche, welche spaltennamen nun eindeutig sind und erleichtert auch das lesen der abfrage. das problem würde ich anders angehen.

    SELECT tab1.jahr, tab1.wert,
    (SELECT MAX(wert) FROM tabelle tab2 WHERE tab1.jahr - 1 = tab2.jahr)
    FROM tabelle tab1

    dann hast du schon mal den wert des jahres davor. und da ich im prozentrechnen immer nicht aufgepasst habe, kannst du sicherlich den rest machen. die MAX-funktion dient nur zur sicherheit, damit nur maximal ein wert geliefert wird. eventuell musst du dir noch eine behandelung für das erste vorkommende hajr ausdenken, denn das hat ja keinen vorgänger.

    Ilja