PostgreSQL не распознает STRAIGHT_JOIN - PullRequest
2 голосов
/ 31 мая 2009
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 ]

4 голосов
/ 31 мая 2009

Просто оставь это. 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);
0 голосов
/ 31 мая 2009

STRAIGHT_JOIN - подсказка, обеспечивающая порядок 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, избавиться или уравнение в запросе:

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
0 голосов
/ 31 мая 2009

STRAIGHT_JOIN - это усовершенствование mysql от pgsql, вы имеете в виду базу данных postgres? Если это так, вы должны посмотреть на стандартные операции SQL. Руководство postgres вызывает уровень соответствия стандартам каждой из их операций. Полезно знать, собираетесь ли вы перемещаться между dbmses.

Посмотрите на www.postgresql.org/docs/8.3/static/tutorial-join.html

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...