【问题标题】:SQL(ite) Remove (and keep some) duplicates in tableSQLite)删除(并保留一些)表中的重复项
【发布时间】:2015-01-02 11:34:39
【问题描述】:

假设我有一张表,名为tablex,如下:

name|year
---------
Bob | 2010
Mary| 2011
Sam | 2012
Mary| 2012
Bob | 2013

名字最多出现两次。我只想从表中删除那些重复且相差一年的名称(在这种情况下,我想保留新的一年)。

name|year
---------
Bob | 2010
Sam | 2012
Mary| 2012
Bob | 2013

我试过了:

SELECT a.Name, a.Year, b.Year
FROM tablex AS a
LEFT JOIN tablex AS b
ON a.Name=b.Name AND (a.Year=b.Year OR b.Year-a.Year=1)
ORDER BY a.Name, a.Year

结果:

  Name YearA YearB
1  Bob  2010  2010
2  Bob  2013  2013
3 Mary  2011  2011
4 Mary  2011  2012
5 Mary  2012  2012
6  Sam  2012  2012

Bob 和 Sam 的条目是正确的,我该如何进一步限制它只包含 Mary 2012 2012

【问题讨论】:

  • 从问题中不清楚是要SELECT(抑制重复)还是实际上DELETE“重复”。
  • 我想要的是SELECT

标签: sql sqlite join


【解决方案1】:

如果您想选择(抑制重复项)或实际删除“重复项”,问题尚不清楚。选择案例:

SELECT a.Name, a.Year
FROM tablex AS a
WHERE NOT EXISTS (
    SELECT * FROM tablex AS b
    WHERE b.Name = a.Name
    AND b.Year = a.Year +1
   );

还有删除案例:

DELETE
FROM tablex AS a
WHERE EXISTS (
    SELECT * FROM tablex AS b
    WHERE b.Name = a.Name
    AND b.Year = a.Year +1
   );

【讨论】:

  • 大声笑,一些白痴因为一些不相关的事情而否决了这个答案。愿意讨论吗?
【解决方案2】:
DELETE FROM tablex t
WHERE year + 1 =
  (SELECT MAX(year)
   FROM tablex
   WHERE name = t.name)

或者,如果您不想删除任何内容,但希望查询只给出所需的结果:

SELECT *
FROM tablex t
WHERE year + 1 !=
  (SELECT MAX(year)
   FROM tablex
   WHERE name = t.name)

【讨论】:

    【解决方案3】:

    你可以使用:

    SELECT a.Name, a.Year, b.Year
    FROM tablex AS a
    LEFT JOIN tablex AS b
    ON a.Name=b.Name AND (a.Year=b.Year )
    ORDER BY a.Name, a.Year
    

    【讨论】:

      【解决方案4】:

      此操作从表中删除同名但年份较新的行:

      delete from tablex t1 where year < (select max(year) from tablex where name = t1.name)
      

      【讨论】:

      • 从表中删除同名但年份较新的行。
      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2013-04-08
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多