Объедините две базы данных в Oracle SQL - PullRequest
0 голосов
/ 04 апреля 2020

Мне нужна твоя помощь. У меня есть две базы данных (например, PEN и PAPER), таблицы которых необходимо объединить. Имя таблицы в db PEN - PEN.ORDER. Имя таблицы в db PAPER - PAPER.ORDER.

Находясь на DAP PAPER, я делаю

SELECT SUPPLIER_NAME 
  FROM PAPER.ORDER AS A
 INNER JOIN PEN.PEN.ORDER AS B 
    ON A.SUPPLIER_ID=B.SUPPLIER_ID

Она не видит таблицу из базы данных PEN. Пытался написать PEN. "PEN.ORDERS" и PEN. [PEN.ORDERS], но ничего не помогло.

Но когда я попробовал аналогичную вещь с другой базой данных, где имя таблицы не содержало точку, это работал очень хорошо. Находясь в БУМАЖНОЙ БД, это было похоже на:

SELECT SUPPLIER_NUMBER 
  FROM PAPER.ORDER AS A 
 INNER JOIN BOOK.ORDERS AS B 
    ON A.SUPPLIER_NUMBER=B.SUPPLIER_NUMBER

Здесь это работало, так как имя таблицы в БУКЕ БД было просто ЗАКАЗЫ без второго слова, разделенного точкой.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Если ваша таблица называется PEN.ORDER в схеме PEN, заключите ее в двойные кавычки, как показано ниже. Также удалите AS из таблицы Alias ​​

     SELECT A.SUPPLIER_NAME 
     FROM PAPER.ORDER  A
     INNER JOIN PEN."PEN.ORDER" B 
     ON A.SUPPLIER_ID=B.SUPPLIER_ID
0 голосов
/ 04 апреля 2020

То, что вы называете «базой данных», является «пользователем» в Oracle.

Вы сказали, что это не работает, когда вы подключены как PAPER:

SELECT SUPPLIER_NAME 
  FROM PAPER.ORDER AS A
 INNER JOIN PEN.PEN.ORDER AS B 
    ON A.SUPPLIER_ID=B.SUPPLIER_ID

Имя таблицы в db PEN - PEN.ORDER. Имя таблицы в db PAPER - PAPER.ORDER.

Если вы хотите иметь возможность получать данные, принадлежащие другому пользователю (в данном случае PEN), владелец таблицы должен предоставить вам (при минимум) SELECT привилегия на свою таблицу. Итак: подключитесь как PEN и запустите

grant select on order to paper;

Затем снова подключитесь как PAPER и выполните

select a.supplier_name
from order a join pen.order b on a.supplier_id = b.supplier_id;

Обратите внимание на несколько изменений, которые я сделал:

  • PEN таблице предшествует имя владельца, только один раз (это не pen.pen.order но pen.order)

Однако : что-то странное в ваших таблицах. order является недопустимым именем в Oracle:

SQL> create table order (id number);
create table order (id number)
             *
ERROR at line 1:
ORA-00903: invalid table name

Если оно действительно использовало это имя, то оно было создано с двойными кавычками, например,

SQL> create table "order" (id number);

Table created.

Но вы не может выбрать из него просто так :

SQL> select * From order;
select * From order
              *
ERROR at line 1:
ORA-00903: invalid table name

Нет - вы должны использовать двойные кавычки, всегда, соответствующие регистру букв, всегда:

SQL> select * From "order";

no rows selected

Предложение: не используйте зарезервированные / ключевые слова для имен объектов. Никогда не используйте двойные кавычки в Oracle, никогда (не то, чтобы это не работало - это будет, как вы видите, но это действительно больно).

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