Eu tenho uma consulta SQL cujos aliases são os mesmos que alguns dos aliases de sua subconsulta.
Por exemplo:
select *
from ROOM r
where ...
(
select *
from ROAD r
where ...
)
Isso funciona bem, pois o alias da subconsulta parece ocultar o principal.
- Funcionará assim em todos os casos?
- Será que algum dia obterei resultados indefinidos?
- Se não há problema em fazer isso, como posso fazer uma referência à consulta principal
r
?
Não há problema em subconsultas aninhadas usarem os mesmos aliases usados na consulta pai, embora possa ser um pouco confuso para alguém lendo o código. O namespace para aliases em uma subconsulta aninhada é separado do namespace no pai. Por exemplo, a consulta abaixo tem uma subconsulta aninhada
b
que também possui um aliasb
usado nela. Isso seria potencialmente confuso para o programador, mas tudo bem com o mecanismo DBMS:Em uma subconsulta correlacionada, você tem acesso aos aliases do pai, portanto, os aliases devem ser exclusivos na consulta pai e na subconsulta correlacionada. Se pegarmos uma subconsulta correlacionada como a abaixo, teremos um único espaço de nome global compartilhado entre a consulta pai e a subconsulta correlacionada:
A subconsulta correlacionada não possui um alias, pois não participa de uma junção como tal 1 . As referências
b
eb2
parabar
estão disponíveis para a subconsulta, pois as subconsultas correlacionadas compartilham seu namespace para aliases com o pai.1 Observe que o otimizador pode optar por usar operadores de junção dentro do plano nos bastidores, embora a operação real especificada seja uma subconsulta correlacionada e não uma junção em uma subconsulta aninhada.
ConcernedOfTunbridgeWells, você escreve (ênfase minha): "Em uma subconsulta correlacionada, você tem acesso aos aliases do pai, portanto, os aliases devem ser exclusivos na consulta pai e na subconsulta correlacionada".
Eu não acredito que a singularidade seja necessária. Acredito que, se um alias for usado em uma subconsulta correlacionada como um nome de correlação, bem como um alias de tabela na consulta externa, o alias na subconsulta terá precedência.
Exemplo:
A saída é "3": as tabelas T e U têm 2 e 3 em comum, mas o
WHERE
predicado filtra ainda mais as linhas retornadas para 3, e 2 não existe em V.