2014-09-18 53 views
0

我有四個要加入的表。我嘗試過,但我得到一些冗餘值。 下面是表的結構:
在oracle中加入4個表

custacdetails:

cid - FK 
acno - PK 

custac:

acno - FK 
acscheme 

custdetails

cid - PK 
fname 

same_ben:

cid 
bacno 

現在我想賬戶和它們各自的細節same_ben通過提供只有CID其帳戶匹配與bacno的全部名單。

這裏是我的查詢

SELECT fname, 
    lname, 
    acscheme, 
    actype, 
    sb.bacno, 
    rdate 
FROM custdetails cd, 
    custac ca, 
    custacdetails cad, 
    same_ben sb 
WHERE cad.acno = ca.acno 
AND cd.custid = cad.custid 
AND cad.acno IN 
    (SELECT bacno FROM same_ben WHERE custid=? 
) 
AND sb.bacno = cad.acno 

回答

0

您的查詢是非常難讀,因爲你正在試圖做內部聯接繞很遠的路。我試着簡化你的查詢,使用以下(未經測試,但應該是正確的),然後找出你得到重複信息的位置,並且需要使你的連接更加嚴格(或使用不同類型的連接)

select 
    fname, lname, acscheme, actype, sb.bacno, rdate 
from custdetails cd   
inner join custacdetails cad 
    on cd.custid = cad.custid 
inner join custac ca 
    on cad.acno = ca.acno 
inner join same_ben sb 
    on sb.custid = cd.custid 
    and sb.bacno = cad.acno 
where 
    cd.cust_id = ?? 

不直接關係到你的問題,但你的字段名和表名是不是很描述...展開這兩個,你會讓生活變得更加簡單和輕鬆了很多對於我們理解。

+0

不,它不工作。顯示「未選擇行」消息。還有一件事我將在same_ben表中提供where條件給custid字段而不是custdetails表。 – 2014-09-19 01:45:42

+0

我沒有真正測試代碼(我沒有數據庫),所以連接可能不正確,但它仍然可以幫助您清理代碼。使用上面的連接,「結構」子句全部包含在連接中,而「where」是你的真正邏輯 – 2014-09-19 16:00:31