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)
???