SQL:删除重复记录 - 尽管类型不同

标签 sql oracle duplicate-data duplicate-removal

考虑下表:

TAB6
         A          B C
---------- ---------- -
         1          2 A
         2          1 A
         2          3 C
         3          4 D

我认为,记录 {1,2, A} 和 {2, 1, A} 是重复的。我需要选择并生成以下记录集:
         A          B C                      A          B C
---------- ---------- -             ---------- ---------- -
         1          2 A         or           2          1 A
         2          3 C                      2          3 C
         3          4 D                      3          4 D

我尝试了以下查询。但无济于事。
select t1.*
from t6 t1
, t6 t2
where t1.a <> t2.b
and t1.b <> t2.a
and t1.rowid <> t2.rowid
/

         A          B C
---------- ---------- -
         1          2 A
         2          1 A
         2          1 A
         2          3 C
         3          4 D
         3          4 D

6 rows selected.

甚至这样:
 select *
 from t6 t1
 where exists (select * from t6 t2 where t1.a <> t2.b and t1.b <> t2.a)
/
         A          B C
---------- ---------- -
         1          2 A
         2          1 A
         2          3 C
         3          4 D

两者都没有工作。

数据库将是 Oracle 10g。寻找纯 SQL 解决方案。感谢您的每一次帮助。

最佳答案

使用 GREATEST() 和 LEAST() 函数来识别跨多个列的公共(public)值。然后使用 DISTINCT 筛选出重复项。

select distinct least(a, b) as a
       , greatest(a, b) as b
       , c
from t6 

这为您提供了您要求的精确记录集。但是,如果您需要包含 T6 中的其他列,事情会变得更加复杂。

"But I was wondering if this will work for VARCHAR2 fields also?"



是的,但它将使用 ASCII 值来确定顺序,这并不总是您所期望(或希望)的。

"Also, my table T6 might have tens of thousand of records."



用今天的术语来说,这真的不是很多数据。 DISTINCT 将导致排序,除非 AB是非常长的 VARCHAR2 列 - 但即使如此。

如果这是一个您想要运行很多的查询,那么您可以构建一个基于函数的索引来满足它:
create index t6_fbi on t6(least(a, b)
                           , greatest(a, b)
                           , c )
/

但是,如果您对查询有真正的性能问题,我真的只会打扰。

关于SQL:删除重复记录 - 尽管类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8829975/

相关文章:

unix - 如何用AWK删除部分重复行?

oracle10g - ORA-01452 : cannot CREATE UNIQUE INDEX; duplicate keys found

python - 列表列表中的重复删除

java - 插入数据时JDBC连接错误

mysql - #1064 MySQL 错误。带有 MRG_MYISAM 引擎的 utf8_general_ci

c++ - 在发布文件夹中运行的 Qt 可执行文件 - Program Files (x86) 中的运行时错误

python - Pyodbc 连接到 Oracle

c# - 数据访问库返回数据集或对象

oracle - 对象关闭时不允许执行 ADO Oracle 操作

sql - 使用 Oracle SQL 组合两个表