如何从 table 中删除重复记录

How to remove duplicate records from the table

我有一个 table 包含以下列

NAME      FRIEND
----------------------
Apple     Flavour
Flavour   Apple
New       Banana
Banana    Flavour

例如,我想删除具有相同组合的记录的列 apple, flavor and flavor, apple 是一样的。当我们重复这样的组合时,我想要两条记录中的一条记录。

您可以使用 LEASTGREATEST 函数来获取唯一组合。

例如,

SQL> WITH DATA AS(
  2  SELECT 'apple' a,   'flavour' b FROM dual UNION ALL
  3  SELECT 'flavour',   'apple' FROM dual UNION ALL
  4  SELECT 'new',   'flavour' FROM dual UNION ALL
  5  SELECT 'banana',   'fruit' FROM dual
  6  )
  7  SELECT least(a,b) a,
  8    greatest(a,b) b
  9  FROM data
 10  GROUP BY least(a,b),
 11    greatest(a,b)
 12  /

A       B
------- -------
banana  fruit
apple   flavour
flavour new

SQL>

为避免重复,请从 select name < friend 的所有行开始。否则,如果反向 name/friend 对不存在,也 return。

select *
from tablename t1
where t1.name < t1.friend
   or not exists (select 1 from tablename t2
                  where t1.name = t2.friend
                    and t1.friend = t2.name)

或者,select distinct,使用 greatestleast

select distinct least(name, friend), greatest(name, friend)
from tablename

SQL Fiddle

Oracle 11g R2 模式设置:

CREATE TABLE Test ( name, friend ) AS
          SELECT 'Apple', 'Flavour' FROM DUAL
UNION ALL SELECT 'Flavour', 'Apple' FROM DUAL
UNION ALL SELECT 'New', 'Banana' FROM DUAL
UNION ALL SELECT 'Banana', 'Flavour' FROM DUAL
/

DELETE FROM TEST
WHERE ROWID IN (
  SELECT MIN( ROWID )
  FROM   test
  GROUP BY
  least( name, friend ),
  greatest( name, friend )
  HAVING COUNT(1) > 1 )
/

查询 1:

SELECT * FROM TEST

Results:

|    NAME |  FRIEND |
|---------|---------|
| Flavour |   Apple |
|     New |  Banana |
|  Banana | Flavour |

效率不如 MySQL:

SQL Fiddle

MySQL 5.6 架构设置:

CREATE TABLE Test (
  name VARCHAR(10),
  friend VARCHAR(10)
)
/

INSERT INTO Test
          SELECT 'Apple', 'Flavour' FROM DUAL
UNION ALL SELECT 'Flavour', 'Apple' FROM DUAL
UNION ALL SELECT 'New', 'Banana' FROM DUAL
UNION ALL SELECT 'Banana', 'Flavour' FROM DUAL
/

DELETE t1
FROM
  TEST t1
  INNER JOIN
  TEST t2
  ON ( t1.Name = t2.friend AND t1.friend = t2.name )
WHERE
  t1.Name > t1.friend
/

查询 1:

SELECT * FROM TEST

Results:

|   name |  friend |
|--------|---------|
|  Apple | Flavour |
|    New |  Banana |
| Banana | Flavour |