Crea un implícito CROSS JOIN
. Es la sintaxis SQL-89.
Aquí uso values(1)
y values(2)
para crear pseduo-tables (tablas de valores) simplemente por ejemplos. Lo que está detrás de ellos t(x)
, y g(y)
se llaman FROM-Alias, el carácter dentro del paréntesis es el alias de la columna ( x
y y
respectivamente). Podría crear fácilmente una tabla para probar esto.
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
Así es como lo escribirías ahora.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
Desde allí puede hacer que esto sea implícito INNER JOIN
agregando un condicional.
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
O la INNER JOIN
sintaxis explícita y más nueva ,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
Entonces en tu ejemplo ...
FROM apod, to_tsquery('neutrino|(dark & matter)') query
Esto es esencialmente lo mismo que la sintaxis más nueva,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
que en realidad es lo mismo, en este caso, porque to_tsquery()
devuelve una fila y no un 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;
Sin embargo, lo anterior podría causar to_tsquery('neutrino|(dark & matter)')
que ocurra dos veces, pero en este caso no lo hace - to_tsquery
está marcado como ESTABLE (verificado con \dfS+ to_tsquery
).
STABLE
indica que la función no puede modificar la base de datos, y que dentro de un escaneo de una sola tabla devolverá de manera consistente el mismo resultado para los mismos valores de argumento, pero que su resultado podría cambiar en las declaraciones SQL. Esta es la selección adecuada para funciones cuyos resultados dependen de búsquedas en la base de datos, variables de parámetros (como la zona horaria actual), etc. (No es apropiado para los desencadenadores DESPUÉS que desean consultar filas modificadas por el comando actual). Tenga en cuenta también que La familia de funciones current_timestamp califica como estable, ya que sus valores no cambian dentro de una transacción.
Para una comparación más completa de las diferencias entre SQL-89 y SQL-92, vea también mi respuesta aquí
,
que sea una unión cruzada, ya que es solo un producto cartesiano y no hay comparación involucrada. ¿Puedes responder 1 pregunta más POR FAVOR? que hayt(x)
en(values(1)) AS t(x)
???