Isso cria um implícito CROSS JOIN
. É a sintaxe SQL-89.
Aqui eu uso values(1)
e values(2)
para criar pseduo-tables (tabelas de valores) apenas para exemplos. A coisa que está depois deles t(x)
, e g(y)
é chamada de FROM-Aliases, o caractere entre parênteses é o alias da coluna ( x
e y
respectivamente). Você poderia facilmente criar uma tabela para testar isso.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
Aqui está como você escreveria agora.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
A partir daí, você pode tornar isso implícito INNER JOIN
adicionando uma condicional.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
Ou a INNER JOIN
sintaxe explícita e mais recente ,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
Então, no seu exemplo ..
FROM apod, to_tsquery('neutrino|(dark & matter)') query
É essencialmente o mesmo que a sintaxe mais recente,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
que é realmente o mesmo, neste caso, porque to_tsquery()
retorna uma linha e não um conjunto como,
SELECT title, ts_rank_cd(
textsearch,
to_tsquery('neutrino|(dark & matter)')
) AS rank
FROM apod
WHERE to_tsquery('neutrino|(dark & matter)') @@ textsearch
ORDER BY rank DESC
LIMIT 10;
No entanto, o acima pode potencialmente to_tsquery('neutrino|(dark & matter)')
ocorrer duas vezes, mas neste caso não ocorre - to_tsquery
está marcado como ESTÁVEL (verificado com \dfS+ to_tsquery
).
STABLE
indica que a função não pode modificar o banco de dados e que, em uma única varredura de tabela, retornará consistentemente o mesmo resultado para os mesmos valores de argumento, mas que seu resultado poderá mudar nas instruções SQL. Essa é a seleção apropriada para funções cujos resultados dependem de pesquisas no banco de dados, variáveis de parâmetro (como o fuso horário atual), etc. (É inadequado para gatilhos AFTER que desejem consultar linhas modificadas pelo comando atual.) A família de funções current_timestamp é qualificada como estável, pois seus valores não mudam dentro de uma transação.
Para uma comparação mais completa das diferenças entre SQL-89 e SQL-92, veja também minha resposta aqui
,
que seja uma junção cruzada, pois é apenas um produto cartesiano e não há comparação envolvida. Você pode responder mais uma pergunta POR FAVOR? o que ét(x)
em(values(1)) AS t(x)
???to_tsquery()
retorna um valor, não uma linha . E só porque uma função é definidaSTABLE
, isso não significa que o planejador de comandos irá evitar a avaliação repetida. Ele pode .O manual possui explicações detalhadas para a vírgula na
FROM
lista do capítulo Expressões da tabela :O fato de que as referências de tabela separadas por vírgula foram definidas em uma versão anterior do padrão SQL que a
JOIN
sintaxe explícita não torna a vírgula incorreta ou desatualizada. Use a sintaxe de junção explícita, onde for tecnicamente necessário (veja abaixo) ou onde torne o texto da consulta mais claro.O manual novamente:
Mas "equivalente" não significa idêntico . Há uma diferença sutil, como observa o manual :
Esta questão relacionada demonstra a relevância da diferença:
Basicamente, sua observação é exatamente correta:
Qualquer função pode ser usada como "função de tabela" na
FROM
lista. E os parâmetros da função podem fazer referência a colunas de todas as tabelas à esquerda da função, porque a notação:é realmente equivalente a:
O manual sobre consultas LATERAIS:
Negrito ênfase minha.
A palavra
AS
- chave é um ruído completamente opcional antes dos aliases da tabela (em oposição aos aliases da coluna , onde é recomendável não omitirAS
para evitar possíveis ambiguidades). Resposta relacionada com mais:fonte