我刚从Postgres开始。阅读本文件时,我遇到了这样的查询:
SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;
我可以理解这个查询中的所有内容,除了这个:FROM apod, ...
。
这个,
是什么意思?我习惯于联接,但不习惯用逗号分隔的多个FROM
语句。
我搜索了一下网,但没有用。在查看和思考之后,在我看来,它似乎声明了一个名为query的变量,以便它可以多次使用它。但是如果这是真的,它与FROM
有什么关系呢?
发布于 2017-03-14 16:12:58
CROSS JOIN
。这是SQL89语法.这里,我使用values(1)
和values(2)
来创建pseduo表(值表),只是举个例子。后面是t(x)
__和g(y)
,称为化名括号中的字符是列的别名(__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()
返回一行而不是集合,
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
被标记为稳定型 (用\dfS+ to_tsquery
验证)。
STABLE
表示该函数无法修改数据库,并且在单个表扫描中,它将始终返回相同参数值的相同结果,但其结果可能会在SQL语句之间发生变化。这是对结果依赖于数据库查找、参数变量(例如当前时区)等的函数的适当选择(对于希望查询由当前命令修改的行的AFTER触发器来说,这是不合适的)。还请注意,current_timestamp系列函数具有稳定的特性,因为它们的值在事务中不发生变化。
要更完整地比较SQL-89和SQL-92之间的差异,请使用也见我在这里的回答。
https://dba.stackexchange.com/questions/167201
复制相似问题