首页 > 解决方案 > Oracle 比较列表

问题描述

我有 2 张桌子AAABBB.Oralce DB

Table AAA
'aaa'
'aaa'
'aaa'
'bbb'
'bbb'

Table BBB
'aaa'
'aaa'
'bbb'
'bbb'
'bbb'

我需要通过以下操作与这些表进行比较:

AAA - BBB

结果:' aaa'

BBB - AAA

结果:' bbb'

BBB intersect AAA

result:
'aaa'
'aaa'
'bbb'
'bbb'

标准操作minus, union, intersect对我没有帮助

标签: sqloracle

解决方案


使用row_number()分析函数,例如:

with AAA as
(
 select 'aaa' as str from dual union all
 select 'aaa' from dual union all
 select 'aaa' from dual union all
 select 'bbb' from dual union all
 select 'bbb' from dual     
), BBB as
(
 select 'aaa' as str from dual union all
 select 'aaa' from dual union all
 select 'bbb' from dual union all
 select 'bbb' from dual union all
 select 'bbb' from dual     
), t as
(
  select row_number() over (order by 1) rn, str from BBB
  minus
  select row_number() over (order by 1) rn, str from AAA
)
select str 
  from t

STR
---
bbb  

然后颠倒表格的顺序。

Demo

如果直接应用减号,那么它会删除所有出现的返回行,即使它们是重复的。因为这两个集合的字符串类型值是相同的。


推荐阅读