Oracle:通过考虑其他列的值来比较两个表之间的列之间的值

时间:2017-02-07 20:38:23

标签: sql oracle difference

我有两个表,TABLE1和TABLE2,每个表包含给定建筑物中给定日期的收银机中的现金账单总额。每个表都是在白天的某个时间拍摄的数据快照。

我想仅列出同一日期同一建筑物的同一收银机中的账单金额(任何账单差额)存在差异的行。收银机ID仅适用于包含它们的建筑物。

目的是找出在同一天的后期快照(TABLE2)中哪些建筑物包含不同数量的钞票的哪些收银机。

TABLE1和TABLE2的数据结构是:

Column  Type    Comment 
ID  NUMBER(10,0) -- Serial 
DAY DATE(7) -- The date  
BUILDING_ID NUMBER(10,0) -- The ID of the building 
REGISTER_ID NUMBER(10,0) -- The ID of the cash register (unique per building ID) 
BILL5   NUMBER(10,0) -- The number of 5 dollar bills 
BILL10  NUMBER(10,0) -- The number of 10 dollar bills 
BILL20  NUMBER(10,0) -- The number of 20 dollar bills 
BILL50  NUMBER(10,0) -- The number of 50 dollar bills

2 个答案:

答案 0 :(得分:2)

SELECT * 
FROM table1 t1 
JOIN table2 t2
  -- Use these critieria to match rows from t1 with rows from t2
  ON ( t1.building_id = t2.building_id 
    AND t1.register_id = t2.register_id 
    AND t1.day = t2.day )
-- Return only rows where the amount of bills in t1 and t2 is different
WHERE  t1.bill5 <> t2.bill5 
        OR t1.bill10 <> t2.bill10 
        OR t1.bill20 <> t2.bill20 
        OR t1.bill50 <> t2.bill50 

答案 1 :(得分:1)

你可以尝试这样的事情。每个表只扫描一次,没有连接。从两个表中选择并为&#34; source&#34;;添加一列; group by day,building_id和register_id以及账单计数 - 并且仅保留计数为1的组。如果账单计数相同,则组内的行数将为2,因此不会返回行;但如果账单数量不同,则不会将这些行组合在一起;每个的行数将为1,并将返回它们。对于这些行(只有1行的组),SELECT中的MAX()没有效果(但它仍然需要,因为它是GROUP BY查询)。

select   max(source) as source, day, building_id, register_id, bill5, bill20, bill50
from     (
           select 'table1' as source, day, building_id, register_id, bill5, bill20, bill50
             from table1
           union all
           select 'table2' as source, day, building_id, register_id, bill5, bill20, bill50
             from table2
         )
group by day, building_id, register_id, bill5, bill20, bill50
having   count(*) = 1
order by day, building_id, register_id, source
;