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

謝謝你的幫助 –