Как создать представление с вложенной таблицей?
Есть представление со столбцами:
("name", "lat", "lon", "P_name", "x1", "x2", "x3")
На данный момент, столбец "name" не является уникальным, но я хочу его таким сделать.
Хочу создать из этого представления вот такое:
('name', 'lat', 'lon', 'obr')
где, при обращении к значению столбца 'obr' "проваливался" бы на таблицу со столбцами:
('P_name', 'x1', 'x2', 'x3')
Просто для каждой строки существует несколько видов оборудования с разными характеристиками, и мне нужно сделать так, чтобы поле 'name' стало уникальным.
Подскажите, это вообще возможно сделать?
Еще раз, хочу видеть, когда пытаюсь обратиться к одной строчке, и хочу чтобы с помощью запроса я мог получить все значения столбцов по отдельности.
Ниже примерно то, что описано выше и желал бы получить:
"name" "lat" "Ion" 'obr'
1 43.22 104.33 |
'P_name' 'xl' 'x2' 'x3'
p1 1 2 3
p2 4 5 6
2 ............................
Ответы (1 шт):
Это называется - объектное представление (Object View).
Допустим, есть такие таблицы:
create table items (id, name) as
select 1, 'item1' from dual union all
select 2, 'item2' from dual
/
create table parts (id, itemid, name) as
select rownum, i.id, i.name||'-'||column_value
from items i cross join xmltable ('"part1","part2"')
/
Для вложенной таблицы надо создать свой тип данных:
create or replace type partT as object (id int, itemid int, name varchar2 (16))
/
create or replace type partsT as table of partT
/
Представление надо сделать так:
create or replace view itemparts as
select i.*, cast (multiset (
select * from parts p where p.itemid = i.id) as partsT) parts
from items i
/
Запрос и резуьтат:
select * from itemparts
/
ID NAME PARTS(ID, ITEMID, NAME)
---------- ----- ----------------------------------------------------------------
1 item1 PARTST(PARTT(1, 1, 'item1-part1'), PARTT(2, 1, 'item1-part2'))
2 item2 PARTST(PARTT(3, 2, 'item2-part1'), PARTT(4, 2, 'item2-part2'))
И конечно возможно обратиться к каждой вложенной таблице отдельным запросом:
select p.*
from itemparts i, table (i.parts) p
where i.id = 1
/
ID ITEMID NAME
---------- ---------- ----------------
1 1 item1-part1
2 1 item1-part2