J'ai une requête SQL dont les alias sont les mêmes que certains des alias de sa sous-requête.
Par exemple:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Cela fonctionne très bien, car l'alias de la sous-requête semble masquer le principal.
- Cela fonctionnera-t-il de cette façon dans tous les cas?
- Vais-je jamais obtenir des résultats indéfinis?
- Si c'est OK pour faire cela, comment puis-je faire une référence à la requête principale
r
?
sql-server
t-sql
subquery
alias
IcySnow
la source
la source
Réponses:
Il est acceptable que les sous-requêtes imbriquées utilisent les mêmes alias que ceux utilisés dans la requête parent, bien que cela puisse être un peu déroutant pour quelqu'un qui lit le code. L'espace de noms pour les alias d'une sous-requête imbriquée est distinct de l'espace de noms sur le parent. Par exemple, la requête ci-dessous a une sous
b
- requête imbriquée qui contient également un aliasb
. Ce serait potentiellement déroutant pour le programmeur mais très bien avec le moteur SGBD:Sur une sous-requête corrélée, vous avez accès aux alias du parent, de sorte que les alias doivent être uniques dans la requête parent et la sous-requête corrélée. Si nous prenons une sous-requête corrélée telle que celle ci-dessous, nous avons un seul espace de nom global partagé entre la requête parent et la sous-requête corrélée:
La sous-requête corrélée n'a pas d'alias car elle ne participe pas à une jointure en tant que telle 1 . Les références
b
etb2
forbar
sont toutes deux disponibles pour la sous-requête, car les sous-requêtes corrélées partagent leur espace de noms pour les alias avec le parent.1 Notez que l'optimiseur peut choisir d'utiliser les opérateurs de jointure dans le plan en arrière-plan, bien que l'opération réelle spécifiée soit une sous-requête corrélée et non une jointure contre une sous-requête imbriquée.
la source
SELECT * FROM ( SELECT c FROM T ) AS T2;
- pas de jointures, pas de corrélation mais le standard SQL requiert que la table dérivée soit affectée à une variable de plage (T2
dans ce cas).ConcernedOfTunbridgeWells, vous écrivez (soulignement le mien): "Sur une sous-requête corrélée, vous avez accès aux alias du parent, donc les alias doivent être uniques dans la requête parent et la sous-requête corrélée."
Je ne crois pas que l'unicité soit requise. Je crois que, si un alias est utilisé dans une sous-requête corrélée comme nom de corrélation, ainsi qu'un alias de table dans la requête externe, l'alias dans la sous-requête aura priorité.
Exemple:
La sortie est "3": les tables T et U ont 2 et 3 en commun, mais le
WHERE
prédicat filtre davantage les lignes renvoyées à 3 et 2 n'existe pas dans V.la source