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
关键字没有任何问题。但是有没有消极的东西去除它?
答案 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