Попытка перехода с Oracle на PostgreSQL

#oracle #postgresql

#Oracle #postgresql

Вопрос:

 SELECT b.SERVICENAME,
       a.PARAMETERNAME,
       a.PARAMETERVALUE
FROM serviceParameter a,
     subscriberService b,
     serviceName c
WHERE a.SUBSCRIBERKEY ( ) = 15677889
  AND b.SUBSCRIBERKEY = 15677889
  AND b.SERVICENAME = a.SERVICENAME( )
  AND c.SERVICENAME = b.SERVICENAME
  AND c.MULTIINSTANCE = '0'
ORDER BY a.SERVICENAME;
 

Как я могу перенести приведенный выше код на PostgresSQL?

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

1. Помимо изучения того, как писать левые и правые внешние соединения, с какими проблемами вы сталкиваетесь. Это может быть хорошим началом: dofactory.com/sql/left-outer-join

2. Я попытался изменить, как показано ниже

3. ВЫБЕРИТЕ b.SERVICENAME, a.PARAMETERNAME , a.PARAMETERVALUE ИЗ serviceparameter правое внешнее соединение subscriberservice b НА b.ServiceName = a. SERVICENAME внутреннее соединение servicename c НА c.SERVICENAME = b. SERVICENAME ГДЕ a.SUBSCRIBERKEY ( ) = $ 1 И b.SUBSCRIBERKEY = $ 2 И c.MULTIINSTANCE = ‘0’ ПОРЯДОК ПО a.»SERVICENAME;

4. получение ошибки как

5. синтаксическая ошибка в СТРОКЕ 1 или рядом с «)»: …rviceName = b.ServiceName ГДЕ a.SubscriberKey( ) = $ 1 И .

Ответ №1:

Вы должны перевести его следующим образом:

 SELECT ...
FROM a, b
WHERE a.x = b.y( )
  AND a.p = 42
  AND b.q( ) = 'foo';
 

станет:

 SELECT ...
FROM a LEFT OUTER JOIN b
        ON a.x = b.y
           AND b.q = 'foo'
WHERE a.p = 42;
 

Это:

  • Сторона с ( ) становится правой стороной a LEFT OUTER JOIN (или, что эквивалентно, левой стороной a RIGHT OUTER JOIN ).
  • Все WHERE условия, содержащие a ( ) , теряют это украшение и переходят в условие соединения.

Синтаксис соединения Oracle легко перевести на стандартный синтаксис, соответствующий стандарту, потому что последний более мощный (и его легче читать при загрузке).

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

1. Согласно моему приведенному выше примеру, должен ли я выполнить внутреннее соединение с таблицей c?

2. Это внешнее соединение a and b , но внутреннее соединение b and c . Итак, что-то вроде b JOIN c LEFT JOIN a .