Subselect
Sven Jacobs
- datenbank
0 Ludger0 Sven Jacobs0 Ludger0 Sven Jacobs0 Ludger
0 Ilja
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!
Hi,
welche Fehlermeldung bekommst Du, wenn Du fuer die Tabellen keine Aliasnamen verwendest?
Gruss,
Ludger
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.
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
SELECT blub1, blub2, innen.blub2
FROM tabelle aussen,
(SELECT blub2
FROM tabelle
WHERE blub1 = aussen.blub1 - 1) innenist denn blub2 hier eindeutig?
Nein, die Spalte ist weder ein PRIMARY KEY noch befindet sich ein UNIQUE Constraint darauf.
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
Ausserdem ist blub1 und blub2 nicht eindeutig.
Genau!
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
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
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