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