如何使用TABLE运算符从两个表中运行查询

问题描述 投票:0回答:1

我有任务:

您必须定义一个集合类型来保存行的属性项目。然后创建一个表格来保存发票数据,包括有关其订单项的信息。不要为以下内容定义单独的表项目。只需包括在中引用的任何项目的属性直接在订单项本身内的订单项。您需要创建使用下面显示的订单项数据生成三张发票。

-------- --------- --------------- ------- ---------------------------- -------- --------- ----------
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;

我创建了表并用数据填充它们-https://dbfiddle.uk/?rdbms=oracle_18&fiddle=cacb503443bb162e03648370b3c53efd

但是我必须提出的要求不起作用。我在做什么错?

sql oracle plsql
1个回答
0
投票

这是我在ruSO上从大家那里得到的答案的翻译(如果有任何翻译错误,我深表歉意。)>

嵌套表应为表declared as a column中的Invoice。表LineItems将按照条款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上。

© www.soinside.com 2019 - 2024. All rights reserved.