2010-03-29 115 views
0

比較,發現兩個表中的差異我有2個表:在甲骨文

  1. 賬號ID, ACC, AE_CCY, DRCR_IND, AMOUNT, MODULE
  2. 柔性ID, ACC, AE_CCY, DRCR_IND, AMOUNT, MODULE

我希望僅顯示通過比較差異:AE_CCY, DRCR_IND, AMOUNT, MODULEACC由前4個字符

實施例:

ID ACC  AE_CCY DRCR_IND AMOUNT MODULE 
-- --------- ------ -------- ------ ------ 
1 734647674 USD D  100 OP 

和在柔性:

ID ACC  AE_CCY DRCR_IND AMOUNT MODULE 
-- --------- ------ -------- ------ ------ 
1 734647654 USD D  100 OP 
2 734665474 USD D  100 OP 
9 734611111 USD D  100 OP 

ID的2和9應顯示爲不同。

如果我使用FULL JOIN我會得到無差異substr(account.ACC,1,4) = substr(flex.ACC,1,4)都是平等的,人都是平等的,減號不起作用,因爲ID的不同。

回答

1

你的意思是你通過ACC的前4個字符想組,然後diff的呢?

並且,如果沒有,原因是軟硬度:ID = 1不覈算的差:ID = 1,如果ID = 2和ID = 9是,特別是因爲它讀取ID不是比較場?

+0

讓我們說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

0

蠻力集理論回答:

SELECT * FROM ID 
UNION 
SELECT * FROM FLEX 
MINUS 
    (SELECT * FROM ID 
    INTERSECT 
    SELECT * FROM FLEX) 
0

我想你想要的是帶有附加條件的充分參與。類似:

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 
+0

如果全部(AE_CCY,DRCR_IND,AMOUNT,MODULE,ACC)同樣的,我們在賬戶表中有5條記錄,在flex表中有1條記錄,差異 - 4條記錄不會顯示 – Ruslan 2010-03-29 18:35:44

0

我喜歡用:

SELECT min(which) which, id, ae_ccy, drcr_ind, amount, module, acc 
    FROM (SELECT DISTINCT 'account' which, id, ae_ccy, drcr_ind, amount, module, 
       substr(acc, 1, 4) acc 
      FROM ACCOUNT 
     UNION ALL 
     SELECT DISTINCT 'flex' which, id, ae_ccy, drcr_ind, amount, module, 
       substr(acc, 1, 4) acc 
      FROM flex) 
GROUP BY id, ae_ccy, drcr_ind, amount, module, acc 
HAVING COUNT(*) != 2 
ORDER BY id, 1 

它會顯示兩個新行,舊的缺失行和任何區別。

+0

需要ID才能顯示:( – Ruslan 2010-03-29 18:31:51

+0

在這種情況下,如果您不使用ID, HAVING COUNT(*)!= 2 - 例如當我們在這兩個表中都有相同的記錄時,這會非常常見,但這並不不同 – Ruslan 2010-03-30 06:42:03

+0

@Ruslan:在查詢中添加ID,然後如果要顯示它。 。 – 2010-03-30 08:07:07