1

我有两个对象关系表:person_tableaccount_table,构建于对象personaccount之外。 一个帐户行为所有共享该帐户的人员提供了一个嵌套表格,其类型为'customer_list'。从嵌套引用表中选择查询

create type person as object(
    id integer, 
    name varchar2, 
    phone varchar2 
); 


create type customer_list as table of ref person; 

create type account as object(
    accid integer, 
    owned_by customer_list, 
    balance Integer 
); 

create table account_table of account; 

create table person_table of person; 

我想选择由特定人员拥有的所有帐户,只要该人员的ID。如何浏览所有嵌入的帐户表,查询是什么?我尝试了不成功的查询。

例如

select a.* 
from account_table a 
where table(a.owned_by) = (select ref(p) from person_table p where p.id=id_given); 

谢谢

+0

我编辑了您的问题以标准化对象名称。 – APC

+0

谢谢,这是更好 –

回答

1

,这里是我的测试数据:

SQL> select * from person_table; 

     ID NAME       PHONE 
---------- ------------------------------ ------------ 
     11 MR KNOX      07000700811 
     22 SAM-I-AM      07000700822 

SQL> select * from account_table; 

    ACCID 
---------- 
OWNED_BY 
-------------------------------------------------------------------------------- 
    BALANCE 
---------- 
     123 
CUSTOMER_LIST(00002202084B026AE209637509E050007F010047FD4B026AE209627509E050007F010047FD 
      , 00002202084B026AE209647509E050007F010047FD4B026AE209627509E050007F010047FD) 
     9900 

     345 
CUSTOMER_LIST(00002202084B026AE209637509E050007F010047FD4B026AE209627509E050007F010047FD) 
     30 


SQL> 

山姆-I​​-AM和先生诺克斯是第一账户和诺克斯的共同所有者是第二个帐户的唯一所有者。要查找诺克斯我们拥有可以运行此查询,它查找从person_table的REF账目......

SQL> select acct.accid 
    2  , acct.balance 
    3  , deref(value(ob)).name as owned_by 
    4  , deref(value(ob)).phone as ntact_noco 
    5 from account_table acct 
    6  cross join table(acct.owned_by) ob 
    7 where ob.column_value = (select ref(p) pref 
    8       from person_table p 
    9       where p.name = 'MR KNOX') 
10/ 

    ACCID BALANCE OWNED_BY      NTACT_NOCO 
---------- ---------- ------------------------------ ------------ 
     123  9900 MR KNOX      07000700811 
     345   30 MR KNOX      07000700811 

SQL> 

或者,我们只能仰望的人与DEREF语法:

SQL> select acct.accid 
    2   , acct.balance 
    3   , deref(value(ob)).name as owned_by 
    4   , deref(value(ob)).phone as contact_no 
    5 from account_table acct 
    6  cross join table(acct.owned_by) ob 
    7 where deref(value(ob)).id = 11 
    8/

    ACCID BALANCE OWNED_BY      CONTACT_NO 
---------- ---------- ------------------------------ ------------ 
     123  9900 MR KNOX      07000700811 
     345   30 MR KNOX      07000700811 

SQL> 
+1

谢谢你的帮助 –