Странное поведение с запросом с использованием DBLink - PullRequest
0 голосов
/ 01 декабря 2018

Это будет трудно воспроизвести.

Запрос с этим шаблоном

SELECT * 
  FROM table1 t1
  LEFT
  JOIN table2@myLink t2
    ON t1.key_field = t2.key_field
  LEFT
  JOIN (SELECT a.*,
               3 dummyField
          FROM table3@myLink a
       ) t3
    ON T1.key_key = t3.key_Field
   AND t3.dummyfield = 
         ( SELECT 3
             FROM dual
         );

Сбой с этой ошибкой

ORA-01799: a column may not be outer-joined to a subquery
01799. 00000 -  "a column may not be outer-joined to a subquery"
*Cause:    <expression>(+) <relop> (<subquery>) is not allowed.
*Action:   Either remove the (+) or make a view out of the subquery.
           In V6 and before, the (+) was just ignored in this case.

Вот где это странно,этот шаблон работает просто отлично:

SELECT * 
  FROM table1 t1
  LEFT
  JOIN (SELECT * FROM table2@myLink) t2 -- Note trivial subquery wrapper
    ON t1.key_field = t2.key_field
  LEFT
  JOIN (SELECT a.*,
               3 dummyField
          FROM table3@myLink a
       ) t3
    ON T1.key_key = t3.key_Field
   AND t3.dummyfield = 
         ( SELECT 3
             FROM dual
         );

Есть мысли?Что же здесь происходит?

Кроме того, у меня есть эти таблицы в одной и той же схеме в другой среде, и первый запрос выполняется без ошибок без ссылок на базы данных.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Следующая информация взята из Oracle Support Doc ID 2258768.1

Мы не поддерживаем внешнее присоединение столбца к подзапросу и, следовательно, ORA-1799 - ожидаемое поведение.

Однако ORA-1799 неверноизбегается из-за преобразования запроса, когда запрос ссылается на локальный объект.

0 голосов
/ 04 декабря 2018

проблема возникает в последнем условии, где левый операнд является столбцом, является ли правый операнд подзапросом для внешнего присоединенного запроса:

AND t3.dummyfield = ( SELECT 3 FROM dual );

, если вы измените эту часть следующим образом:

WHERE t3.dummyfield =  ( SELECT 3 FROM dual );

Ваша проблема будет решена.

Ваш рабочий запрос будет:

SELECT * 
FROM table1 t1
LEFT JOIN table2@myLink t2
  ON t1.key_field = t2.key_field
LEFT JOIN
  (SELECT a.*,3 dummyField
    FROM table3@myLink a) t3 
ON  T1.key_key = t3.key_Field
WHERE t3.dummyfield = ( SELECT 3
  FROM dual
);

PS: обратите внимание, что оба ваших запроса имеют синтаксическую ошибку на втором операнде LEFT JOIN ON,PS: обратите внимание, что ваш второй запрос не работает так же с JOIN (SELECT * FROM table2@myLink) t2

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