它创建一个隐式CROSS JOIN
。这是SQL-89语法。
在这里,我仅使用values(1)
和values(2)
创建pseduo表(值表)作为示例。在他们之后的事t(x)
,和g(y)
被称为FROM-别名括号内的字符是列(别名x
和y
分别)。您可以轻松地创建一个表来对此进行测试。
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)
这是您现在编写的方式。
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
从那里,您可以INNER JOIN
通过添加条件来使其隐式。
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;
或显式和更新的INNER JOIN
语法,
SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
ON ( x = z );
因此,在您的示例中。
FROM apod, to_tsquery('neutrino|(dark & matter)') query
这基本上与更新的语法相同,
FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query
在这种情况下,实际上是相同的,因为to_tsquery()
返回一行而不是set,
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;
但是,以上内容可能会导致to_tsquery('neutrino|(dark & matter)')
发生两次,但是在这种情况下,它不会- to_tsquery
被标记为STABLE(已通过验证\dfS+ to_tsquery
)。
STABLE
表示该函数无法修改数据库,并且在单个表扫描中它将针对相同的参数值一致地返回相同的结果,但其结果可能会在SQL语句之间发生变化。对于其结果取决于数据库查找,参数变量(例如当前时区)等的函数,这是适当的选择。(对于希望查询当前命令修改的行的AFTER触发器来说,这是不合适的。)还请注意, current_timestamp系列功能符合稳定条件,因为它们的值在事务中不会更改。
有关SQL-89和SQL-92之间差异的更完整比较,请参见此处的我的答案
,
交叉连接是有意义的,因为它只是笛卡尔积,并且没有涉及比较。您能再回答1个问题吗?是什么t(x)
在(values(1)) AS t(x)
???