当前位置: 首页 > 面试题库 >

SQL:删除重复的记录-尽管是另一种

华和悦
2023-03-14
问题内容

请考虑下表:

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()函数来识别多个列中的公共值。然后使用DISTINCT清除重复项。

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

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

“但是我想知道这是否也适用于VARCHAR2字段?”

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

“此外,我的表T6可能有数万条记录。”

从今天的角度来看,这确实不是很多数据。该DISTINCT会引起一种,它应该能够装入内存,除非AB有很长的VARCHAR2列-但可能即使这样。

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

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

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



 类似资料:
  • 问题内容: 我有一个sql server数据库,我已经预加载了大量的数据行。 不幸的是,数据库中没有主键,并且表中现在有重复的信息。我不担心没有主键,但是我担心数据库中存在重复项… 有什么想法吗?(原谅我成为sql server newb) 问题答案: 好吧,这就是为什么您应该在表上拥有主键的原因之一。什么版本的SQL Server?对于SQL Server 2005及更高版本: 然后,您不必在明

  • 本文向大家介绍sql 删除表中的重复记录,包括了sql 删除表中的重复记录的使用技巧和注意事项,需要的朋友参考一下 遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢 如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) 然后就可以直接删除,基本原理就是,找到重复记录的每一条记录,排除掉重复id最小的记录,删除剩余的重复

  • 问题内容: 请帮助我了解基于rownum的删除记录,即使id重复,也不会发生,但是如果是这样的话。 查询已尝试,但删除所有6行。 但是此查询给出正确的结果: 预期结果 : 问题答案: 使用 当然,您也可以这样做。该所以你是否删除具有较大的行或较小的地址不要紧只是该行的物理地址。 但是,您的预期结果没有任何意义。 该结果集的总是在查询时分配。这意味着在不同的查询中(或同一查询多次运行时)特定的行可能

  • 这是我的原始表格: 预期表: 我无法向表中添加新列。

  • 问题内容: 在我们的系统中,我们每小时从外部数据库导入一次。由于导入脚本中的错误,现在有一些重复的记录。 如果任何记录具有和,则视为重复。 我可以运行什么代码来查找和删除这些重复项? 我在玩这个: 它似乎返回了一些重复项,但是我不确定如何从那里删除? 有任何想法吗? 问题答案: 您可以尝试以下方法: 还是纯sql:

  • 问题内容: 嗨,在这里我遇到了一种情况,即由于错误地没有删除表,我已经运行了该表的批处理文件,该文件由一些详细的插入语句组成 我有一个像alert_priority的表由类似 现在错误地没有删除 alert_priority 我已经执行了表的脚本文件,其中包含一些插入语句,现在执行脚本后,我在表中的记录就像 现在,我想删除多余的记录(Id 3之后的记录),并且在执行脚本文件之前,我应该拥有所有存在