Сущность связь в Oracle sql dev

Добавить в таблицу связи в бд данные с таблиц сущностей,то есть например один столбец в таблице связи должен быть заполнен значениями сущности. Как это надо делать через Insert into ?


Ответы (2 шт):

Автор решения: 0xdb

Сделайте на основе следующего воспроизводимого примера:

create or replace type person force as object (id int, name varchar2 (8))
/
create or replace type address as object (id int, address varchar2 (16))
/
create table persons of person (id primary key)
/
create table addresses of address (id primary key)
/
create table address_person (persid int, addrid int)
/
insert all 
into persons values   (person  ( 1, 'name1'))
into addresses values (address (99, 'address99'))
select null from dual
/

Вставить данные в таблицу связей можно так:

insert into address_person 
    select p.id, a.id
    from persons p, addresses a
    where p.name = 'name1' and a.address = 'address99'

Вот, что получится:

select p.id, p.name, a.id, a.address
from persons p
join address_person m on m.persid = p.id
join addresses a on a.id = m.addrid 
/

        ID NAME             ID ADDRESS         
---------- -------- ---------- ----------------
         1 name1            99 address99       
→ Ссылка
Автор решения: 0xdb

Связи между таблицами, содержащие сущности объектов, обычно реализуются не через значения их атрибутов, а через ссылки на сами сущности, полученые функцией REF. В выборке отпадает нужда в соединении таблиц посредством JOIN.

Пример со вставкой в таблицу связи (с остальными данными на db<>fiddle):

create table address_person (
    pers ref person scope is persons, addr ref address scope is addresses)
/
insert into address_person 
    select ref (p), ref (a)
    from persons p, addresses a
    where p.id = 1 and a.id = 99
/

Сам запрос и его результат:

select r.pers.id, r.pers.name, r.addr.id, r.addr.address
from address_person r 
/

   PERS.ID PERS.NAM    ADDR.ID ADDR.ADDRESS    
---------- -------- ---------- ----------------
         1 name1            99 address99       
→ Ссылка