Estou começando agora com o Postgres. Lendo este documento me deparei com esta consulta:
SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
Eu posso entender tudo nesta consulta, exceto isso: FROM apod, ...
.
O que isso ,
significa? Estou acostumado a junções, mas não a várias FROM
instruções separadas por uma vírgula.
Procurei na net sem sucesso. Depois de olhar e pensar, me parece que está declarando uma variável chamada query para poder usá-la várias vezes. Mas se isso for verdade, o que isso tem a ver FROM
?
O manual tem explicação detalhada para a vírgula na
FROM
lista no capítulo Expressões de Tabela :O fato de as referências de tabela separadas por vírgula terem sido definidas em uma versão anterior do padrão SQL do que a
JOIN
sintaxe explícita não torna a vírgula errada ou desatualizada. Use a sintaxe de junção explícita, onde for tecnicamente necessário (veja abaixo) ou quando tornar o texto da consulta mais claro.O manual novamente:
Há casos de canto em que ambos não são completamente equivalentes. O manual:
Esta questão relacionada demonstra a relevância da diferença:
Basicamente, sua observação está exatamente correta:
Qualquer função pode ser usada como "função de tabela" na
FROM
lista. E os parâmetros da função podem referenciar colunas de todas as tabelas à esquerda da função, porque a notação:... é realmente equivalente a:
O manual sobre consultas LATERAL:
Minha ênfase em negrito .
A palavra- chave
AS
é ruído completamente opcional antes de aliases de tabela (em oposição a aliases de coluna , onde é recomendado não omitirAS
para evitar possíveis ambiguidades). Ver:Ele cria um implícito
CROSS JOIN
. É a sintaxe SQL-89.Aqui eu uso
values(1)
evalues(2)
para criar pseduo-tables (tabelas de valores) meramente para exemplos. A coisa depois delest(x)
, eg(y)
são chamados de FROM-Aliases o caractere dentro dos parênteses é o alias para a coluna (x
ey
respectivamente). Você poderia facilmente criar uma tabela para testar isso.Aqui está como você escreveria agora.
A partir daí, você pode tornar isso implícito
INNER JOIN
adicionando uma condicional.INNER JOIN
Ou a sintaxe explícita e mais recente ,Então no seu exemplo..
Isso é essencialmente o mesmo que a sintaxe mais recente,
que na verdade é o mesmo, neste caso, porque
to_tsquery()
retorna uma linha e não um conjunto como,No entanto, o acima pode fazer
to_tsquery('neutrino|(dark & matter)')
com que ocorra duas vezes, mas neste caso não acontece --to_tsquery
está marcado como STABLE (verificado com\dfS+ to_tsquery
).Para uma comparação mais completa das diferenças entre SQL-89 e SQL-92, veja também minha resposta aqui