PostgreSQL无法识别STRAIGHT_JOIN

时间:2009-05-31 02:56:27

标签: 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.tid = t.tid)

它说:

ERROR: syntax error at or near "s"
SQL state: 42601
Character: 23

我正在加入,但它给了我那个错误。如果我删除它执行的STRAIGHT_JOIN关键字没有任何问题。但是有没有消极的东西去除它?

3 个答案:

答案 0 :(得分:4)

请不要理会。 STRAIGHT_JOIN是MySQL增强功能,其工作方式与INNER JOIN类似,但STRAIGHT_JOIN强制首先读取左表。当优化器做出糟糕的决策重新排序表时,这是一种覆盖MySQL优化器的方法。

这一切与PostgreSQL无关。 STRAIGHT_JOIN语法关键字不仅特定于MySQL,而且它影响优化器内部的功能也是如此。每个品牌的数据库都有自己的优化器实现,每个都有自己的特性。

此外,您可以使用标准的SQL-92 JOIN语法,而不是过时的逗号样式连接。以下是我将如何编写此查询:

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);

答案 1 :(得分:0)

STRAIGHT_JOIN是一个mysql增强,pgsql,你指的是postgres数据库吗?如果是这样,您应该查看SQL标准操作。 postgres手册调用了每个操作的标准合规级别。很高兴知道你是否会在dbmses之间移动。

请参阅www.postgresql.org/docs/8.3/static/tutorial-join.html

答案 2 :(得分:0)

STRAIGHT_JOIN是一个在[{1}}中执行JOIN订单的提示。

MySQL开发人员不喜欢提示,这就是PostgreSQL缺少此功能的原因。

如果您不知道/关心PostgreSQL订单是什么,请忽略此关键字:

JOIN

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 AND s.tid = t.tid 除了MySQL之外没有实现任何JOIN方法,但NESTED LOOPS除外。

PostgreSQL订单对JOIN毫无意义,不能强加于MERGE JOIN PostgreSQL

您可以将某些列设置为不可搜索,这会强制HASH JOIN使用预期的PostgreSQL顺序,以防优化程序选择JOIN

NESTED LOOPS

如果优化程序选择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 ,则会强制JOIN订单。

要强制NESTED LOOPS,请在查询中删除或等同于:

NESTED LOOPS