Estou vendo um exemplo de subconsulta correlacionada com aliases de um livro do PostgreSQL:
bpsimple=# SELECT * FROM orderinfo o,
bpsimple=# (SELECT * FROM customer c WHERE town = 'Bingham') c
bpsimple=# WHERE c.customer_id = o.customer_id;
Por que o c
alias é usado duas vezes aqui? O que está entre parênteses não é suficiente?
Como o @ypercube já explicou , a subconsulta não possui referência a colunas na consulta externa, podendo ser processada de forma independente. Portanto, não é uma "subconsulta correlacionada". Alguns chamam isso de "tabela derivada" ou apenas "subconsulta".
Quanto às suas perguntas:
c1
é um alias de tabelacustomer
na subconsulta, abreviação decustomer AS c1
. A palavraAS
-chave foi omitida, o que é bom, pois seria apenas ruído para um alias de tabela . Cito o manual sobre "Omitir a palavra-chave AS" :O exemplo provavelmente serve para demonstrar visibilidade: apenas o alias da tabela externa é visível na
WHERE
cláusula externa, portanto, não há conflito de nomenclatura comc
usado duas vezes.Caso contrário,
c1
é inútil aqui, pois nada se refere a ele. Você pode simplesmente deixá-lo cair.c2
é outro alias de tabela para a "tabela derivada". Este é obrigatório, pois o Postgres requer um nome para cada tabela usada e uma subconsulta não tem nenhum até que você a nomeie.A única diferença:
customer_id
é listado uma vez em vez de duas vezes no resultado (devido àUSING
cláusula), o que seria preferível, pois é completamente redundante neste caso.Detalhes no manual sobre
SELECT
.