#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;
Это:
- Сторона с
( )
становится правой стороной aLEFT OUTER JOIN
(или, что эквивалентно, левой стороной aRIGHT OUTER JOIN
). - Все
WHERE
условия, содержащие a( )
, теряют это украшение и переходят в условие соединения.
Синтаксис соединения Oracle легко перевести на стандартный синтаксис, соответствующий стандарту, потому что последний более мощный (и его легче читать при загрузке).
Комментарии:
1. Согласно моему приведенному выше примеру, должен ли я выполнить внутреннее соединение с таблицей c?
2. Это внешнее соединение
a
andb
, но внутреннее соединениеb
andc
. Итак, что-то вродеb JOIN c LEFT JOIN a
.