我想你想要的是帶有附加條件的充分參與。類似:
select F.ID, F.AE_CCY, F.DRCR_IND, F.AMOUNT, F.MODULE, F.ACC
from account a join flex f
on substr(a.ACC,1,4) = substr(f.ACC,1,4)
where a.AE_CCY <> f.AE_CCY
or a.DRCR_IND <> f.DRCR_IND
or a.AMOUNT <> f.AMOUNT
or a.MODULE <> f.MODULE
or a.ACC <> f.ACC
以這種方式,加入仍然在第一4個字符進行,但其中條件檢查整個字段(以及其它四個)。
修訂後的解決方案:這是一個刺中的黑暗中的東西,我想知道如果你真正想要的是一個沒有在其他匹配的記錄列表表。在這種情況下,一個完整的外部聯接可能是答案:
select coalesce(F.ID,a.ID) as ID,
coalesce(F.AE_CCY,a.AE_CCY) as AE_CCY,
coalesce(F.DRCR_IND,a.DRCR_IND) as DRCR_IND,
coalesce(F.AMOUNT,a.AMOUNT) as AMOUNT,
coalesce(F.MODULE,a.MODULE) as MODULE,
coalesce(F.ACC,a.ACC) as ACC
from account a full outer join flex f
on substr(a.ACC,1,4) = substr(f.ACC,1,4)
and a.AE_CCY = f.AE_CCY
and a.DRCR_IND = f.DRCR_IND
and a.AMOUNT = f.AMOUNT
and a.MODULE = f.MODULE
where a.id is null
or f.id is null
第三嘗試的解決方案:關於它的進一步思考,我覺得你說你想從第一個表中的每個記錄相匹配準確第二個表中有一條記錄(反之亦然)。這是一個困難的問題,因爲關係數據庫並非真正的設計工作。
下面的解決方案採用了全外再次加入,以獲得沒有出現在其他表中只有行。這一次,我們添加了ROW_NUMBER來爲每個表中找到的一組重複值中的每個成員分配一個唯一編號。在從評論,以在一個表中,而在另一個同一行的1 5個相同的行中的例子中,第一表將被編號爲1-5和第二個將是1。因此,通過添加作爲連接條件,我們確保每一行只有一個匹配。這種設計中的一個缺陷是ACC上的完美匹配不能保證優先於另一個值。做這項工作會比較困難。
select coalesce(F.ID,a.ID) as ID,
coalesce(F.AE_CCY,a.AE_CCY) as AE_CCY,
coalesce(F.DRCR_IND,a.DRCR_IND) as DRCR_IND,
coalesce(F.AMOUNT,a.AMOUNT) as AMOUNT,
coalesce(F.MODULE,a.MODULE) as MODULE,
coalesce(F.ACC,a.ACC) as ACC
from (select a.*,
row_number()
over (partition by AE_CCY,DRCR_IND,AMOUNT,MODULE,substr(ACC,1,4)
order by acc) as rn
from account a) a
full outer join
(select f.*,
row_number()
over (partition by AE_CCY,DRCR_IND,AMOUNT,MODULE,substr(ACC,1,4)
order by acc) as rn
from flex f) f
on substr(a.ACC,1,4) = substr(f.ACC,1,4)
and a.AE_CCY = f.AE_CCY
and a.DRCR_IND = f.DRCR_IND
and a.AMOUNT = f.AMOUNT
and a.MODULE = f.MODULE
and a.RN = f.RN
where a.id is null
or f.id is null
讓我們說ID是不同的,其餘的都可以完全比較。如何比較: 1. account:ID,ACC,AE_CCY,DRCR_IND,AMOUNT,MODULE 2. flex:ID,ACC,AE_CCY,DRCR_IND,AMOUNT,MODULE – Ruslan 2010-03-29 18:38:37