【问题标题】:How to remove duplicate records from the table如何从表中删除重复记录
【发布时间】:2015-06-15 07:51:41
【问题描述】:

我有一个包含以下列的表格

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

例如,我想删除具有相同组合记录的列 苹果,味道和味道,苹果是一样的。当我们重复这样的组合时,我只想要两条记录中的一条记录。

【问题讨论】:

  • Oracle 和 MySQL 是两个不同的产品,SQL 版本有些不同。你用的是哪一个?
  • 你搜索过这个网站吗?这个问题有很多重复。
  • aer 您实际上是在尝试删除重复的行,还是只想要一个只选择不重复的查询?
  • @jarlh 我正在 Oracle 和 MySql 中尝试这个
  • @dataEnthusiast 然后 Lalit Kumar 的答案就是你需要 mysql

标签: mysql sql oracle hive


【解决方案1】:

您可以使用 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>

【讨论】:

  • 感谢您的回答对我有帮助。
  • @dataEnthusiast 很高兴它有帮助。您应该将其标记为已回答。
【解决方案2】:

为避免重复,首先选择 name

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

【讨论】:

  • 感谢您的回答,这对我有帮助:)
【解决方案3】:

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 |

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 2016-01-07
    • 2013-02-07
    • 2019-11-25
    • 2011-09-15
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多