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 apelido da subconsulta parece ocultar o principal.
- Funcionará assim em todos os casos?
- Vou obter resultados indefinidos?
- Se não for possível fazer isso, como posso fazer uma referência às consultas principais
r
?
sql-server
t-sql
subquery
alias
IcySnow
fonte
fonte
Respostas:
Não há problema em subconsultas aninhadas usarem os mesmos aliases usados na consulta pai, embora possa ser um pouco confuso para alguém ler o código. O espaço de nome para aliases em uma subconsulta aninhada é separado do espaço de nome 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 adequado para o mecanismo DBMS:Em uma subconsulta correlacionada, você tem acesso aos aliases do pai, portanto, os aliases devem ser únicos na consulta pai e na subconsulta correlacionada. Se fizermos 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 associação como tal 1 . As referências
b
eb2
forbar
estão disponíveis para a subconsulta, pois as subconsultas correlacionadas compartilham seu espaço de nomes 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 contra uma subconsulta aninhada.
fonte
SELECT * FROM ( SELECT c FROM T ) AS T2;
- sem junções, sem correlação, ainda que o padrão SQL exija que a tabela derivada receba uma variável de intervalo (T2
neste caso).ConcernedOfTunbridgeWells, você escreve (ênfase minha): "Em uma subconsulta correlacionada, você tem acesso aos aliases dos pais, portanto os aliases devem ser exclusivos na consulta pai e na subconsulta correlacionada."
Eu não acredito que a exclusividade 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 a 3 e 2 não existe em V.fonte