2017-10-28 88 views
0

我需要查找擁有賬戶的客戶的客戶ID,姓氏和出生日期所有分支 Adam里維拉擁有賬戶SQL:查找在'Adam Rivera'擁有賬戶的所有分支中擁有賬戶的客戶

這是銀行的模式:

§ Customer = {customerID, firstName, lastName, income, birthDate } 
§ Account = {accNumber, type, balance, branchNumberFK-Branch} 
§ Owns = {customerIDFK-Customer, accNumberFK-Account} 
§ Transactions = {transNumber, accNumberFK-Account, amount} 
§ Employee = {sin, firstName, lastName, salary, branchNumberFK-Branch} 
§ Branch = {branchNumber, branchName, managerSINFK-Employee, budget} 

所有分支號碼,亞當·里維拉擁有,查詢得到:

branchNumber 
1 
4 

SELECT b2.branchNumber -- all branches that Adam Rivera owns 
FROM Customer c2 join Owns o2 on c2.customerID = o2.customerID join Account a2 on a2.accNumber = o2.accNumber join Branch b2 on b2.branchNumber = a2.branchNumber 
WHERE c2.firstName = 'Adam' and c2.lastName = 'Rivera' 

分支號碼列表客戶已在亞當·里維拉的分支機構的帳戶,該reuslt是:

cusID lstName birthDate branch# 
10839 Hayes 1977-06-09 1 
10839 Hayes 1977-06-09 4 
11790 Green 1920-11-19 1 
11790 Green 1920-11-19 1 
13230 Brooks 1967-05-04 1 
13423 Simmons 1955-03-21 1 
13423 Simmons 1955-03-21 4 
13697 Hill 1951-03-07 1 
13697 Hill 1951-03-07 4 
14295 Ramirez 1983-06-30 4 
18166 Barnes 1951-03-07 1 
19973 Kelly 1987-07-15 1 
22050 Sanchez 1935-01-08 1 
....... 


SELECT c1.customerID, c1.lastName, c1.birthDate, b1.branchNumber 

FROM Customer c1 join Owns o1 on c1.customerID = o1.customerID join Account a1 on a1.accNumber = o1.accNumber join Branch b1 on b1.branchNumber = a1.branchNumber 

WHERE EXISTS 
     SELECT b3.branchNumber 
     FROM Customer c3 join Owns o3 on c3.customerID = o3.customerID join Account a3 on a3.accNumber = o3.accNumber join Branch b3 on b3.branchNumber = a3.branchNumber 
     WHERE c3.firstName = 'Adam' and c3.lastName = 'Rivera' and b1.branchNumber = b3.branchNumber 

下面的結果應該返回所有分支的一個客戶沒有一個帳戶,如果客戶在每個分支都有賬戶,那麼這個結果是空的。

WHERE NOT EXISTS 
    (branch numbers that Adam Rivera owns) 
    EXCEPT 
    (a list of branch numbers that a customer has account at Adam Rivera's branches) 

使用NOT EXIST WHERE後,應返回客戶誰擁有所有亞當·里維拉的賬戶

這是我寫的查詢。

SELECT c1.customerID, c1.lastName, c1.birthDate 

FROM Customer c1 join Owns o1 on c1.customerID = o1.customerID join Account 
a1 on a1.accNumber = o1.accNumber join Branch b1 on b1.branchNumber = 
a1.branchNumber 

WHERE NOT EXISTS 

    (-- all branch numbers that Adam Rivera owns 
    (SELECT b2.branchNumber 
    FROM Customer c2 join Owns o2 on c2.customerID = o2.customerID join 
Account a2 on a2.accNumber = o2.accNumber join Branch b2 on b2.branchNumber = a2.branchNumber 
    WHERE c2.firstName = 'Adam' and c2.lastName = 'Rivera') 

    EXCEPT 

    -- a list of branch numbers that a customer has account at Adam Rivera's branches 
    (SELECT b3.branchNumber 
    FROM (Customer c3 join Owns o3 on c3.customerID = o3.customerID join Account a3 on a3.accNumber = o3.accNumber join Branch b3 on b3.branchNumber = a3.branchNumber) 
    WHERE c3.firstName = 'Adam' and c3.lastName = 'Rivera' and b1.branchNumber = b3.branchNumber) 
) 

查詢應該返回Hayes,Simmons,Hill。但結果不會返回任何結果(錯誤)。我無法弄清楚這裏有什麼問題。

+3

用您正在使用的數據庫標記您的問題。 –

回答

1

這裏有一個方法:

with ar as (
     select distinct a.branchNumber 
     from Customer c join 
      Owns o 
      on c.customerID = o.customerID join 
      Account a 
      on a.accNumber = o.accNumber 
     where c.firstName = 'Adam' and c.lastName = 'Rivera' 
    ) 
select o.customerId 
from Owns o 
    Account a 
    on a.accNumber = o.accNumber join 
    ar 
    on ar.branchNumber = a.branchNumber 
group by o.customerId 
having count(distinct a.branchNumber) = (select count(*) from ar); 

子查詢是里維拉先生擁有該帳戶。 join匹配每個帳戶。 group byhaving計算每個客戶不同分支的數量,並檢查該數字是否與Rivera先生的電話號碼相符。

相關問題