我有两个表,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
答案 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
;