ORA-02019: описание соединения для удаленной базы данных не найдено — левое соединение в представлении

У меня есть 3 таблицы:

table1: id, person_code
table2: id, address, person_code_foreing(same with that one from table 1), admission_date_1
table3: id, id_table2, admission_date_2, something

(таблицы вымышленные)

Я пытаюсь создать представление, которое берет информацию из этих трех таблиц, используя left join, я делаю так, потому что в первой таблице у меня есть запись, у которой нет person_code в другие таблицы, но я хочу, чтобы эта информация возвращалась представлением:

CREATE OR REPLACE VIEW schema.my_view
   SELECT t1.name, t2.adress, t3.something
   from schema.table1@ambient1 t1
   left join schema.table2@ambient1 t2
    on t1.person_code = t2.person_code_foreing
   left join schema.table3@ambient1 t3
    on t3.id_table2 = t2.id
   and t1.admission_date_1=t2.admission_date_2;

Это представление должно быть создано в другом окружении (ambient2).

Я пытался использовать подзапрос, там мне также нужно использовать левое соединение, и это очень сбивает с толку, потому что я не понимаю, подзапрос и левое соединение - это большое нет-нет ?! Или просто де левый джойн?!

Это случилось с кем-нибудь? Как ты это решил?

Большое спасибо.


person Someone112    schedule 03.06.2020    source источник
comment
Ошибка возвращается при попытке в ambient2? похоже, это указывает на то, что используемая вами dblink не создана/не видна в этой среде.   -  person gsalem    schedule 03.06.2020


Ответы (2)


ORA-2019 указывает, что ваша ссылка на базу данных (@ambient1) не существует или не видна текущему пользователю. Вы можете подтвердить, проверив представление ALL_DB_LINKS, в котором должны быть перечислены все ссылки, к которым у пользователя есть доступ:

select owner, db_link from all_db_links;

Также имейте в виду, что Oracle будет выполнять соединения в базе данных, выполняющей вызов, а не в удаленной базе данных, так что вам почти наверняка придется перетаскивать все содержимое всех трех таблиц по сети для записи. в TEMP для соединения, а затем выбрасывается, каждый раз, когда вы выполняете запрос. Вы также потеряете преимущества любых индексов данных и, скорее всего, закончите полным сканированием временных таблиц внутри ваша локальная база данных.

Я не знаю, подходит ли вам этот вариант, но с точки зрения производительности и учитывая, что он не соединяется ни с чем в локальной базе данных, было бы гораздо разумнее создать представление в удаленной базе данных и просто запросить что через ссылку базы данных. Таким образом, все соединения выполняются эффективно там, где находятся данные, по сети передается только результирующий набор, а SQL вашей клиентской базы данных становится намного проще.

person pmdba    schedule 03.06.2020

Мне удалось заставить его работать, но, видимо, ambient2 не нравится мое "левое соединение", и я использовал только подзапрос и оператор (+), вот как это сработало:

    CREATE OR REPLACE VIEW schema.my_view
       SELECT t1.name, all.adress, all.something
       from schema.table1@ambient1 t1,(select * from
    schema.table3@ambient1 t3, schema.table2@ambient1 t2
        where t3.id_table2 = t2.id(+)
       and (t1.admission_date_1=t2.admission_date_2 or t1.admission_date is null)) 
all
        where t1.person_code = t2.person_code_foreing(+);

Я попытался проверить, работает ли запрос в ambient2 с использованием правого соединения (с 2 созданными там таблицами), и он работает. Я думал, что есть проблема с этим окружением ..

Для меня нет смысла, почему в моем случае такое соединение извлекает эту ошибку.

Версии разные?! Я не знаю, и я не нахожу никаких официальных документов об этом.

Может быть, у кого-то из вас есть какие-то догадки..

Для меня есть загадка :))

Спасибо.

person Someone112    schedule 03.06.2020