PostgreSQL无法识别直接连接
它说:PostgreSQL无法识别直接连接,postgresql,Postgresql,它说: SELECT STRAIGHT_JOIN s.*, date_part('epoch', s.date) AS unixdate, date_part('epoch', s.expire) as expireunix, u.username, u.fullname, u.photo, u.email, t.topic, t.imageurl FROM stories s, users u, topics t WHERE (s.uid = u.uid) AND (s.ti
SELECT STRAIGHT_JOIN s.*, date_part('epoch', s.date) AS unixdate,
date_part('epoch', s.expire) as expireunix, u.username, u.fullname,
u.photo, u.email, t.topic, t.imageurl
FROM stories s, users u, topics t WHERE (s.uid = u.uid) AND (s.tid = t.tid)
我正在做一个连接,但它给了我那个错误。如果我删除了STRAIGHT_JOIN关键字,它将毫无问题地执行。但是删除它有什么负面影响吗?STRAIGHT\u JOIN是一个mysql增强,由pgsql提供,您指的是postgres数据库吗?如果是这样,您应该看看SQL标准操作。postgres手册列出了每个操作的标准合规性级别。很高兴知道您是否将在DBMS之间移动 请访问www.postgresql.org/docs/8.3/static/tutorial join.html只需将其删除即可。STRAIGHT_JOIN是一种MySQL增强功能,其工作原理类似于内部联接,但STRAIGHT_JOIN强制首先读取左表。这是一种覆盖MySQL优化器的方法,当优化器在重新排序表时做出错误的决定 所有这些都与PostgreSQL无关。不仅是MySQL特有的STRAIGHT_JOIN语法关键字,而且它影响优化器内部的功能也非常强大。每个品牌的数据库都有自己的优化器实现,每个品牌都有自己的特性 您还可以使用标准SQL-92联接语法,而不是过时的逗号样式联接。下面是我将如何编写此查询:
ERROR: syntax error at or near "s"
SQL state: 42601
Character: 23
STRAIGHT_JOIN是在MySQL中强制执行连接顺序的提示
PostgreSQL开发人员不喜欢提示,这就是PostgreSQL缺少此功能的原因
如果您不知道/不关心连接顺序是什么,只需忽略以下关键字:
SELECT s.*, DATE_PART('epoch', s.date) AS unixdate,
DATE_PART('epoch', s.expire) AS expireunix, u.username,
u.fullname, u.photo, u.email, t.topic, t.imageurl
FROM stories s
INNER JOIN users u ON (s.uid = u.uid)
INNER JOIN topics t ON (s.tid = t.tid);
除了嵌套循环,MySQL没有实现任何连接方法,但PostgreSQL实现了
连接顺序对于合并连接没有意义,并且不能在PostgreSQL中强制进行哈希连接
您可以使某些列不可搜索,这将迫使PostgreSQL在优化器选择嵌套循环时使用预期的连接顺序:
这将强制联接顺序,以防优化器选择嵌套循环
要强制嵌套循环,请在查询中删除或删除equijoin:
SELECT s.*, date_part('epoch', s.date) AS unixdate,
date_part('epoch', s.expire) as expireunix, u.username, u.fullname,
u.photo, u.email, t.topic, t.imageurl
FROM stories s, users u, topics t
WHERE s.uid = (u.uid + 1) - 1
AND t.tid = (s.tid + 1) - 1
好的,谢谢你给我手册的链接,但是如果我把它删掉,查询会执行得很好还是会有一些怪癖是的。查询结果是否相同。直接连接和连接之间的区别只对mysql查询优化器有意义,而不是查询结果。
SELECT s.*, date_part('epoch', s.date) AS unixdate,
date_part('epoch', s.expire) as expireunix, u.username, u.fullname,
u.photo, u.email, t.topic, t.imageurl
FROM stories s, users u, topics t
WHERE s.uid = (u.uid + 1) - 1
AND t.tid = (s.tid + 1) - 1
SELECT s.*, date_part('epoch', s.date) AS unixdate,
date_part('epoch', s.expire) as expireunix, u.username, u.fullname,
u.photo, u.email, t.topic, t.imageurl
FROM stories s, users u, topics t
WHERE s.uid > u.uid - 1
AND s.uid < u.uid + 1
AND t.tid > s.tid - 1
AND t.tid < s.tid + 1