Запрос Oracle -> Postgres тот же запрос - PullRequest
0 голосов
/ 17 сентября 2018

Ранее я попросил помощи по запросу Oracle, который пытался преобразовать в запрос Postgres:

SELECT c.code, c.recommendation, s.suggested, s.sugg_by, a.approved, a.app_by
FROM (SELECT code, recommendation FROM recommendations) c,
     (SELECT code, suggested, sugg_by FROM suggestions) s,
     (SELECT code, approved, app_by FROM suggestions) a
WHERE c.code = s.code(+)
  AND c.code = a.code(+);

Кто-то рекомендовал это, и он отлично работает:

SELECT
    c.code,
    c.recommendation, 
    s.suggested,
    s.sugg_by, 
    a.approved,
    a.app_by
FROM recommendations c 
LEFT JOIN suggestions s on c.code = s.code
LEFT JOIN suggestions a ON c.code = a.code;

Я забыл упомянуть одну вещь: мне нужно добавить соединение в таблицу USERS, чтобы получить имя пользователя.

sugg_by = u.user_id
app_by = u.user_id

Итак, как-то так:

SELECT c.code, c.recommendation, s.suggested, s.sugg_by, s.full_name, a.approved, a.app_by, a.full_name
FROM (SELECT code, recommendation FROM recommendations) c,
     (SELECT code, suggested, sugg_by, full_name FROM suggestions s, users u WHERE s.sugg_by = u.user_id) s,
     (SELECT code, approved, app_by, full_name FROM approvals a, users u WHERE a.app_by = u.user_id) a
WHERE c.code = s.code(+)
  AND c.code = a.code(+);

В основном мне нужны имена также из таблицы USERS. Достаточно просто в Oracle, просто пытаюсь собрать это вместе для Postgres.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вам не нужны все подзапросы:

SELECT c.code,
       c.recommendation,
       s.suggested,
       s.sugg_by,
       su.full_name,
       a.approved,
       a.app_by,
       au.full_name
FROM   recommendations c
       LEFT JOIN suggestions s ON c.code = s.code
       LEFT JOIN users su ON s.sugg_by = su.user_id
       LEFT JOIN approvals a ON c.code = a.code
       LEFT JOIN users au ON a.sugg_by = au.user_id;

Кстати, это должно работать как в Oracle, так и в Postgres.

0 голосов
/ 17 сентября 2018

Вы можете присоединиться к запросу так же, как вы присоединяетесь к «простой» ссылке на таблицу:

SELECT c.code, 
       c.recommendation, 
       s.suggested, 
       s.sugg_by, 
       s.full_name, 
       a.approved, 
       a.app_by, 
       a.full_name
FROM recommendations c
  LEFT JOIN (
    SELECT code, suggested, sugg_by, full_name 
    FROM suggestions s 
      JOIN users u ON s.sugg_by = u.user_id
  ) s ON c.code = s.code
  LEFT JOIN (
    SELECT code, approved, app_by, full_name 
    FROM approvals a
      JOIN users u ON a.app_by = u.user_id
  ) a on c.code = a.code

Но, как отметил Аллан: вам действительно не нужны эти производные таблицы («подзапросы»),Гораздо проще делать такие вещи, используя явные операторы JOIN (или LEFT JOIN), а не архаичный и проприетарный оператор Oracle (+) (даже Oracle рекомендует прекратить его использование).

...