Как выполнить запрос из двух таблиц с оператором TABLE?
Выполняю задание:
You must define a collection type to hold the attributes of a line item. Then create a table to hold the invoice data including information about its line items. Do not define a separate table for item. Simply include the attributes of any item that is referenced in a line item directly within the line item itself.
You need to create three invoices using the line item data shown below.
INVOICE# SHIPDATE TERMS ITEMID DESCRIPTION QUANTITY UNITPRICE LINETOTAL
-------- --------- --------------- ------- ---------------------------- -------- --------- ----------
INV001 27-APR-18 CREDIT A000100 GREEN WIDGET 1 35.10 35.10
A000200 BLUE WIDGET 3 35.10 105.30
INV002 27-APR-18 Due on Receipt A001000 WHITE WIDGET 5 35.10 175.50
A000800 ORANGE THREE-HANDLED WIDGET 8 45.99 367.92
A000200 BLUE WIDGET 6 35.10 210.60
A000700 YELLOW THREE-HANDLED WIDGET 2 43.25 86.50
A000400 ORANGE WIDGET 1 45.99 45.99
INV003 27-APR-18 Due on Receipt
Затем, нужно следующим запросом получить список всех фактур и товаров в них:
SELECT LI.*
FROM INVOICE I, TABLE(I.LINEITEMS) LI;
Я создал таблицы и заполнил их данными:
CREATE TABLE Invoice(
INVOICE# VARCHAR(50) not null,
SHIPDATE date,
TERMS VARCHAR(50)
);
CREATE TABLE LineItems(
ItemId VARCHAR(50) not null,
Quantity int not null,
Description VARCHAR(50) not null,
UNITPRICE decimal (10,5) not null,
LineTotal decimal (10,5) not null
);
Но когда я выполняю запрос, то получаю ошибку:
ORA-00904: "I"."LINEITEMS": invalid identifier
Что я делаю не так?
Ответы (1 шт):
Вложенную таблицу надо обьявить как столбец в таблице Invoice. Таблица LineItems будет создана автоматически кaк указано в клаузе STORE AS. Вот так:
create or replace type LineItemT as object (
ItemId varchar (50),
Quantity int,
Description varchar (50) ,
UnitPrice decimal (10,5) ,
LineTotal decimal (10,5)
)
/
create or replace type LineItemsТ as table of LineItemТ
/
create table Invoice (
Invoice# varchar (50) not null,
shipdate date,
terms VARCHAR(50),
LineItems LineItemsT
)
nested table LineItems store as LineItems
/
Заполните данными и запрос будет работать:
insert into Invoice values (
'INV001', date'27-04-18', 'CREDIT',
LineItemsT (LineItemT ('A000100', 1, 'GREEN WIDGET', 35.10, 35.10),
LineItemT ('A000200', 6, 'BLUE WIDGET', 35.10, 210.60)));
select Invoice# invNo, li.*
from invoice i, table (i.lineitems) li;
INVNO ITEMID QUANTITY DESCRIPTION UNITPRICE LINETOTAL
---------- ---------- ---------- ---------------- ---------- ----------
INV001 A000100 1 GREEN WIDGET 35,1 35,1
INV001 A000200 6 BLUE WIDGET 35,1 210,6
На db<>fiddle.