Mam zapytanie SQL, którego aliasy są takie same jak niektóre aliasy jego podzapytania.
Na przykład:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Działa to dobrze, ponieważ alias podzapytania wydaje się ukrywać główny.
- Czy to zadziała we wszystkich przypadkach?
- Czy kiedykolwiek uzyskam niezdefiniowane wyniki?
- Jeśli jest to w porządku, jak mogę odwoływać się do głównych zapytań
r
?
sql-server
t-sql
subquery
alias
IcySnow
źródło
źródło
Odpowiedzi:
W zagnieżdżonych podkwerendach można używać tych samych aliasów, co w zapytaniu nadrzędnym, chociaż może to być nieco mylące dla osoby czytającej kod. Przestrzeń nazw dla aliasów w zagnieżdżonym podzapytaniu jest oddzielna od przestrzeni nazw w obiekcie nadrzędnym. Na przykład poniższe zapytanie zawiera zagnieżdżone podzapytanie,
b
które ma równieżb
używany alias . Byłoby to potencjalnie mylące dla programisty, ale w porządku z silnikiem DBMS:W skorelowanym podzapytaniu masz dostęp do aliasów rodzica, więc aliasy muszą być unikalne w zapytaniu nadrzędnym i skorelowanym podzapytaniu. Jeśli weźmiemy skorelowane podkwerendy, takie jak poniższe, mamy jedną globalną przestrzeń nazw współdzieloną między kwerendą nadrzędną a skorelowaną podkwerendą:
Skorelowane podzapytanie nie ma aliasu, ponieważ nie uczestniczy w sprzężeniu jako takim 1 . Odnośniki
b
ib2
forbar
są dostępne dla podkwerendy, ponieważ skorelowane podkwerendy współużytkują swoją przestrzeń nazw dla aliasów z rodzicem.1 Zauważ, że optymalizator może zdecydować się na użycie operatorów łączenia w planie za kulisami, chociaż rzeczywista określona operacja jest skorelowanym podzapytaniem, a nie złączeniem z podzapytaniem zagnieżdżonym.
źródło
SELECT * FROM ( SELECT c FROM T ) AS T2;
- brak sprzężeń, brak korelacji, jednak standard SQL wymaga, aby tabeli pochodnej przypisano zmienną zakresu (T2
w tym przypadku).ConcernedOfTunbridgeWells piszesz (moje podkreślenie): „W skorelowanym podzapytaniu masz dostęp do aliasów rodzica, więc aliasy muszą być unikalne w zapytaniu nadrzędnym i skorelowanym podzapytaniu”.
Nie wierzę, że wyjątkowość jest wymagana. Uważam, że jeśli w skorelowanym podzapytaniu zostanie użyty alias jako nazwa korelacji, a także alias tabeli w zapytaniu zewnętrznym, pierwszeństwo będzie miał alias w podzapytaniu.
Przykład:
Dane wyjściowe to „3”: tabele T i U mają wspólne 2 i 3, ale
WHERE
predykat dodatkowo filtruje wiersze zwrócone do 3, a 2 nie istnieje w V.źródło