Запрос отлично работает в MySQL, но не в PostgreSQL

#mysql #postgresql

#mysql #postgresql

Вопрос:

Этот запрос отлично работает в MySQL, но не в PostgreSQL:

 select
concat(hc.id, hl.languagecode) AS id,
hc.id AS category_id,
hl.languagecode AS languagecode
from language hl
join category hc
left join categorytranslation hct ON hl.languagecode = hct.languagecode and hc.id = hct.category_id;
  

В PostgreSQL я иногда получал ошибку:

ОШИБКА: синтаксическая ошибка в конце СТРОКИ ввода 9: ….languagecode = hct.languagecode и hc.id = hct.category_id ^ Ошибка запроса PostgreSQL сказал: синтаксическая ошибка в конце ввода

Или пустой результат. Я использую Postico для его тестирования.

Что с ним не так?

Что я хочу сделать, так это получить результат этого:

  select
        concat(hc.id, hl.languagecode) AS id,
        hc.id AS category_id,
        hl.languagecode AS languagecode,
        hc.slug AS slug
from category hc, language hl
  

Но я также хочу присоединиться к таблице с переводом ‘categorytranslation’. Если доступен перевод, который следует использовать вместо таблицы «категория». Для этого я изменил запрос следующим образом:

     SELECT
            concat(hp.id, hl.languagecode) AS id,
            hp.id AS id,
            hl.languagecode AS languagecode,
            hpt.languagecode as translang,
            CASE WHEN (hpt.languagecode is not null and hpt.slug is not null and trim(hpt.slug) <> '')
              THEN hpt.slug
              ELSE hp.slug
            END AS slug,
    from language hl
join category hc
left join categorytranslation hct ON hl.languagecode = hct.languagecode and hc.id = hct.category_id;
  

Комментарии:

1. Условие соединения выглядит немного странно, поскольку вы выполняете перекрестное соединение между таблицами language и category . Это правильно?

Ответ №1:

В PostgreSQL для каждого соединения требуется фраза условия соединения. В вашем запросе отношения между таблицами выглядят так hl -> hct -> hc ; затем запрос становится:

 SELECT hc.id || languagecode AS id,
       hc.id AS category_id,
       languagecode
FROM language hl
LEFT JOIN hapis_hatracocategorytranslation hct USING (languagecode)
JOIN category hc ON hc.id = hct.category_id;
  

Обратите внимание, что при использовании USING фразы в первом условии соединения нет двусмысленности между languagecode столбцами из обеих таблиц, поэтому вы можете опустить псевдоним в списке выбора.

Комментарии:

1. Спасибо за ваш ответ. Это работает до сих пор, но результат возвращает результаты только для одного «languagecode». Таблица «язык» содержит 5 языков. Поля: id, active, languagecode