Ich habe eine SQL-Abfrage, deren Aliase mit denen einiger Aliase der Unterabfrage übereinstimmen.
Beispielsweise:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Dies funktioniert einwandfrei, da der Alias der Unterabfrage den Alias der Hauptabfrage zu verbergen scheint.
- Funktioniert das auf alle Fälle so?
- Bekomme ich jemals undefinierte Ergebnisse?
- Wenn das in Ordnung ist, wie kann ich dann auf die Hauptabfrage verweisen
r
?
sql-server
t-sql
subquery
alias
IcySnow
quelle
quelle
Antworten:
Für verschachtelte Unterabfragen ist es in Ordnung, dieselben Aliase wie für die übergeordnete Abfrage zu verwenden, obwohl dies für jemanden, der den Code liest, etwas verwirrend sein kann. Der Namensraum für Aliase in einer verschachtelten Unterabfrage unterscheidet sich vom Namensraum auf dem übergeordneten Element. Die folgende Abfrage enthält beispielsweise eine verschachtelte Unterabfrage
b
, in der auch ein Aliasb
verwendet wird. Für den Programmierer ist dies möglicherweise verwirrend, für die DBMS-Engine jedoch in Ordnung:In einer korrelierten Unterabfrage haben Sie Zugriff auf die Aliase der übergeordneten Abfrage, sodass die Aliase in der übergeordneten Abfrage und in der korrelierten Unterabfrage eindeutig sein müssen. Wenn wir eine korrelierte Unterabfrage wie die folgende verwenden, haben wir einen einzigen globalen Namensraum, der von der übergeordneten Abfrage und der korrelierten Unterabfrage gemeinsam genutzt wird:
Die korrelierte Unterabfrage hat keinen Alias, da sie nicht an einem Join als solchem teilnimmt 1 . Die Referenzen
b
undb2
fürbar
stehen der Unterabfrage beide zur Verfügung, da korrelierte Unterabfragen ihren Namespace für Aliase mit dem übergeordneten Element teilen.1 Beachten Sie, dass das Optimierungsprogramm im Hintergrund möglicherweise Verknüpfungsoperatoren im Plan verwendet, obwohl der angegebene Vorgang eine korrelierte Unterabfrage und keine Verknüpfung mit einer verschachtelten Unterabfrage ist.
quelle
SELECT * FROM ( SELECT c FROM T ) AS T2;
- Keine Verknüpfungen, noch keine Korrelation Der SQL-Standard verlangt, dass der abgeleiteten Tabelle eine Bereichsvariable zugewiesen wird (T2
in diesem Fall).ConcernedOfTunbridgeWells, schreiben Sie (Hervorhebung von mir): „Auf einer korrelierten Unterabfrage Sie Zugriff auf die Eltern - Aliase haben, so dass die Aliase müssen über die übergeordnete Abfrage und korrelierte Unterabfrage eindeutig sein.“
Ich glaube nicht, dass Einzigartigkeit erforderlich ist. Ich glaube, wenn ein Alias in einer korrelierten Unterabfrage als Korrelationsname sowie ein Tabellenalias in der äußeren Abfrage verwendet wird, hat der Alias in der Unterabfrage Vorrang.
Beispiel:
Die Ausgabe ist "3": Tabellen T und U haben 2 und 3 gemeinsam, aber das
WHERE
Prädikat filtert die zu 3 zurückgegebenen Zeilen weiter und 2 ist in V nicht vorhanden.quelle