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

SQL:删除重复记录-尽管类型不同,sql,oracle,duplicate-data,duplicate-removal,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

考虑下表:

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解决方案。非常感谢您的帮助。

使用最大和最小函数来识别多列中的公共值。然后使用DISTINCT筛选出重复项

select distinct least(a, b) as a
       , greatest(a, b) as b
       , c
from t6 
这将为您提供所需的精确记录集。但是如果需要包含T6中的其他列,事情会变得更加复杂

但我想知道这是否也适用于VARCHAR2 fields

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

另外,我的表T6可能有上万条记录

用今天的术语来说,这真的不是很多数据。DISTINCT将产生一个排序,除非a和B是真正长的VARCHAR2列,否则它应该能够放入内存中,但即使如此

如果这是一个需要大量运行的查询,那么您可以构建一个基于函数的索引来满足它:

create index t6_fbi on t6(least(a, b)
                           , greatest(a, b)
                           , c )
/

但是,我只会在查询出现真正的性能问题时才麻烦您。

如果a列和B列的顺序无关紧要并且总是包含整数,那么:

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

你到底想完成什么?请对此进行扩展。我需要一个SQL来生成记录集{1,2,a},{2,3,C}和{3,4,D}。对我来说,{1,2,A}和{2,1,A}是重复的记录,结果集应该只有一个元组,{1,2,A}或{2,1,A},但不是两者都必须清楚,你的意思是从结果集中删除筛选器,而不是删除。@APC,你是对的。删除意味着在结果集中过滤。谢谢你的更正。谢谢@APC,我现在无法检查这个。但我想知道这是否也适用于VARCHAR2 fields?另外,我的表T6可能有上万条记录。。我很感激你的回答,但Stackoverflow仍然不允许我投你一票