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)
???to_tsquery()
devuelve un valor no una fila . Y sólo porque se define una funciónSTABLE
, eso no significa que el planificador de consulta será evitar la evaluación repetida. Es posible .El manual tiene una explicación detallada de la coma en la
FROM
lista en el capítulo Expresiones de tabla :El hecho de que las referencias de tabla separadas por comas se hayan definido en una versión anterior del estándar SQL que la
JOIN
sintaxis explícita no hace que la coma sea incorrecta u obsoleta. Utilice la sintaxis de unión explícita, donde sea técnicamente necesario (ver más abajo) o donde aclare el texto de la consulta.El manual nuevamente:
Pero "equivalente" no significa idéntico . Hay una sutil diferencia, como señala el manual :
Esta pregunta relacionada demuestra la relevancia de la diferencia:
Básicamente, su observación es exactamente correcta:
Cualquier función se puede usar como "función de tabla" en la
FROM
lista. Y los parámetros de la función pueden hacer referencia a columnas de todas las tablas a la izquierda de la función, porque la notación:es realmente equivalente a:
El manual sobre consultas LATERALES:
El énfasis audaz es mío.
La palabra clave
AS
es ruido completamente opcional antes de los alias de tabla (a diferencia de los alias de columna , donde se recomienda no omitirAS
para evitar posibles ambigüedades). Respuesta relacionada con más:fuente