Tengo una consulta SQL cuyos alias son los mismos que algunos de sus alias de subconsulta.
Por ejemplo:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Esto funciona bien, ya que el alias de la subconsulta parece ocultar el principal.
- ¿Funcionará de esa manera en todos los casos?
- ¿Alguna vez obtendré resultados indefinidos?
- Si está bien hacer eso, ¿cómo puedo hacer una referencia a la consulta principal
r
?
sql-server
t-sql
subquery
alias
IcySnow
fuente
fuente
Respuestas:
Está bien que las subconsultas anidadas utilicen los mismos alias que se usan en la consulta principal, aunque puede ser un poco confuso para alguien que lee el código. El espacio de nombre para los alias en una subconsulta anidada es independiente del espacio de nombre en el padre. Por ejemplo, la consulta a continuación tiene una subconsulta anidada
b
que también tiene un aliasb
utilizado. Esto sería potencialmente confuso para el programador, pero está bien con el motor DBMS:En una subconsulta correlacionada, tiene acceso a los alias principales, por lo que los alias deben ser únicos en la consulta principal y la subconsulta correlacionada. Si tomamos una subconsulta correlacionada como la siguiente, tenemos un espacio de nombre global único compartido entre la consulta principal y la subconsulta correlacionada:
La subconsulta correlacionada no tiene un alias ya que no participa en una unión como tal 1 . Las referencias
b
yb2
forbar
están disponibles para la subconsulta ya que las subconsultas correlacionadas comparten su espacio de nombres para los alias con el padre.1 Tenga en cuenta que el optimizador puede elegir usar operadores de unión dentro del plan detrás de escena, aunque la operación real especificada es una subconsulta correlacionada y no una unión contra una subconsulta anidada.
fuente
SELECT * FROM ( SELECT c FROM T ) AS T2;
- sin combinaciones, sin correlación, sin embargo, el estándar SQL requiere que a la tabla derivada se le asigne una variable de rango (T2
en este caso).ConcernedOfTunbridgeWells, usted escribe (el énfasis es mío): "En una subconsulta correlacionada tiene acceso a los alias principales, por lo que los alias deben ser únicos en la consulta principal y la subconsulta correlacionada".
No creo que se requiera singularidad. Creo que, si se usa un alias en una subconsulta correlacionada como nombre de correlación, así como un alias de tabla en la consulta externa, el alias en la subconsulta tendrá prioridad.
Ejemplo:
El resultado es "3": las tablas T y U tienen 2 y 3 en común, pero el
WHERE
predicado filtra aún más las filas devueltas a 3, y 2 no existe en V.fuente