【问题标题】:How to extract data from three tables using SQL object relational statement in oracle 11goracle 11g中如何使用SQL对象关系语句从三个表中提取数据
【发布时间】:2018-03-14 14:41:16
【问题描述】:

我有三个表 Branch、Account_table 和 customer。我正在尝试为以下内容编写 SQL 语句:

在每个分行寻找储蓄账户余额最高的客户。在他们的当前账户中显示他们的姓名、余额、分行 ID 和免费透支限额。

我已经创建了三个表并插入数据:

分支表

BID        BADDRESS.STREET      BADDRESS.CITY        BADDRESS.P
---------- -------------------- -------------------- ----------
901        Nicholson Street     Edinburgh            EH11 5AB  
906        East End Garden      Glasgow              G181QP    
912        Fredrick Street      London               LA112AS   
918        Zink Terrace         Edinburgh            EH149UU 

Account_table

ACCNUM ACCTYPE            BALANCE BID.BID        INRATE LIMITOFFREEOD OPENDATE
------- --------------- ---------- ---------- ---------- ------------- --------
 1001 current              820.5 901              .005           800 01-MAY-11
 1010 saving                2155 906               .02             0 08-MAR-10
 1002 current               2600 912              .005          1000 10-APR-13
 1011 saving                4140 918               .02             0 24-OCT-13

客户表

CUSTID CADDRESS.STREET      CADDRESS.CITY  CADDRESS.POSTCODE    CNAME.FIRSTNAME CNAME.SURNAME       
---------- -------------------- ----------- -------------------- --------------- -----------
      1002 Adam Street          Edinburgh   EH112LQ              Jack            Smith               
      1003 Adam Street          Edinburgh   EH112LQ              Anna            Smith               
      1004 New Tweed            Edinburgh   EH1158L              Liam            Bain                
      1005 Dundas Street        Edinburgh   EH119MN              Usman           Afaque              
      1006 St Andres Square     Edinburgh   EH12LNM              Claire          Mackintosh  

分支(bID、街道、城市、p_code、bPhone)

Account(accNum, accType, balance, bID, inRate, limitOfFreeOD, openDate)

客户(custID、街道、城市、邮政编码、职务、名字、surName、custHomePhone、custMobile1、custMobile2、niNum)

粗体是主键斜体是外键(在对象关系中,如果我是对的,我们不使用 Join)。

这就是我想做但失败的事情

select c.custid,
(select max(balance) from account_table a
where  c.CUSTID = a.bid.bid 
and a.acctype='saving' )as highest_saving,
c.cname.firstname,c.CNAME.surname
from  customer c;

有什么帮助吗?谢谢。

【问题讨论】:

  • 您在帐户表中缺少列 custID。

标签: oracle11g


【解决方案1】:

您在帐户表中缺少 custID 列。我已经添加了几行数据来为您的需求创建测试用例。

drop table acct;
drop table branch;
drop table customer;

create table branch(bid number primary key, addr_street varchar2(100), addr_city varchar2(100), addr_p  varchar2(20));
insert into branch values(901,'Nicholson Street','Edinburgh','EH11 5AB');
insert into branch values(906,'East End Garden','Glasgow','G181QP');
insert into branch values(912,'Fredrick Street','London','LA112AS');
insert into branch values(918,'Zink Terrace','Edinburgh','EH149UU');
commit;

select * from branch;

输出:

BID ADDR_STREET         ADDR_CITY   ADDR_P
901 Nicholson Street    Edinburgh   EH11 5AB
906 East End Garden     Glasgow     G181QP
912 Fredrick Street     London      LA112AS
918 Zink Terrace        Edinburgh   EH149UU

create table customer(custid number primary key, caddr_street varchar2(100), caddr_city varchar2(100), 
                      caddr_p varchar2(10), fname varchar2(100), lname varchar2(100));
insert into customer values(1002,'Adam Street','Edinburgh','EH112LQ','Jack','Smith');
insert into customer values(1003,'Adam Street','Edinburgh','EH112LQ','Anna','Smith');
insert into customer values(1004,'New Tweed','Edinburgh','EH1158L','Liam','Bain');
insert into customer values(1005,'Dundas Street','Edinburgh','EH119MN','Usman','Afaque');
insert into customer values(1006,'St Andres Square','Edinburgh','EH12LNM','Claire','Mackintosh');
commit;

select * from customer;

输出:

CUSTID  CADDR_STREET        CADDR_CITY  CADDR_P FNAME   LNAME
1002    Adam Street         Edinburgh   EH112LQ Jack    Smith
1003    Adam Street         Edinburgh   EH112LQ Anna    Smith
1004    New Tweed           Edinburgh   EH1158L Liam    Bain
1005    Dundas Street       Edinburgh   EH119MN Usman   Afaque
1006    St Andres Square    Edinburgh   EH12LNM Claire  Mackintosh

create table acct(accnum number primary key, acctype varchar2(20), balance number, bid number
                  constraint acct_fk1 references branch(bid), 
                   inrate number, LIMITOFFREEOD number, OPENDATE date, custid number
                   constraint acct_fk2 references customer(custid));
insert into acct values(1001,'current',820.5,901,0.005,800,to_date('01-MAY-11','dd-mon-yy'),1002);
insert into acct values(1010,'saving',2155,906,0.02,0,to_date('08-MAR-10','dd-mon-yy'),1002);
insert into acct values(1002,'current',2600,912,0.005,1000,to_date('10-APR-13','dd-mon-yy'),1006);
insert into acct values(1011,'saving',4140,918,0.02,0,to_date('24-OCT-13','dd-mon-yy'),1004);
insert into acct values(1012,'saving',4155,906,0.02,0,to_date('08-MAR-10','dd-mon-yy'),1004);
insert into acct values(1013,'current',2600,918,0.005,1000,to_date('10-APR-13','dd-mon-yy'),1004);
commit;

select * from acct;

输出:

ACCNUM  ACCTYPE BALANCE BID INRATE  LIMITOFFREEOD   OPENDATE    CUSTID
1001    current 820.5   901 .005    800             01-MAY-11   1002
1010    saving  2155    906 .02     0               08-MAR-10   1002
1002    current 2600    912 .005    1000            10-APR-13   1006
1011    saving  4140    918 .02     0               24-OCT-13   1004
1012    saving  4155    906 .02     0               08-MAR-10   1004
1013    current 2600    918 .005    1000            10-APR-13   1004

select y.fname, y.lname, y.balance, y.bid,ac.accnum,ac.acctype,ac.LIMITOFFREEOD 
  from (select * 
          from (select b.bid, c.custid, a.accnum,a.balance, 
                       row_number() over(partition by b.bid order by a.balance desc) rn,
                       c.fname, c.lname
                  from acct a 
                       inner join 
                       branch b 
                    on a.bid = b.bid 
                       inner join 
                       customer c 
                    on a.custid = c.custid
                 where a.acctype = 'saving') x
         where x.rn = 1) y
       left join 
       acct ac 
    on y.custid = ac.custid 
   and y.bid = ac.bid 
   and ac.acctype = 'current';

输出:

FNAME   LNAME   BALANCE BID ACCNUM  ACCTYPE LIMITOFFREEOD
Liam    Bain    4140    918 1013    current 1000
Liam    Bain    4155    906 NULL    NULL    NULL

【讨论】:

  • 抱歉回复晚了。非常感谢您的全面回复。
  • 您好,如何为一个账户添加两个客户 ID 以使其成为联名账户?谢谢。
  • 可能会在帐户表中添加另一个 JcustID 列
  • 需要另一个带有 custid 和 accnum 属性的 customer_account 表。我认为两者都是PK/FK。但不知道这将如何运作?
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 2018-02-11
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多