SQL删除重复的行

时间:2012-06-21 20:03:29

标签: python sql database sqlite

  

可能重复:
  Delete duplicate rows

这是我的表结构:

“作者”(varchar)| “点”(整数)| “身体”(文字)

作者总是一样的,身体也是如此。同一作者条目将在整个数据库中多次出现,具有不同的主体,因此我无法根据作者删除。但是,点列并不总是相同。我希望保持行具有最大的点值。

我正在使用SQLite3和Python。

由于

编辑:

我试过这个,但它只是删除了所有行。

for row in cur.fetchall():
        rows = cur.execute('SELECT * FROM Posts WHERE Author=? AND Body=? AND Nested=? AND Found=?', (row['Author'], row['Body'], row['Nested'], row['Found'],))
        for row2 in rows:
            delrow = row
            if (row['Upvotes'] <  row2['Upvotes'] or row['Downvotes'] < row2['Downvotes']):
                delrow = row2
            cur.execute("DELETE FROM Posts WHERE Author=? AND Body=? AND Upvotes=? AND Downvotes=? AND Nested=? AND Found=?", (delrow['Author'], delrow['Body'], delrow['Upvotes'], delrow['Downvotes'], delrow['Nested'], delrow['Found'],))
            dn += 1
            print "Deleted row ", dn

我也尝试了这个,但它没有用。

cur.execute("DELETE FROM Posts WHERE Upvotes NOT IN (SELECT MAX(Upvotes) FROM Posts GROUP BY Body);")

我也提交了所有更改,所以不是这样。 SQLite3模块安装正确,我可以在db上写。

3 个答案:

答案 0 :(得分:2)

不幸的是,在SQLite3中你没有像partition over row那样的好函数,所以在一个查询中没有办法做到这一点,所以你要么必须在程序上或迭代地进行。

出于性能原因,我建议您提取完整的删除潜力列表,然后将其删除,例如。

# in your sql query
SELECT ROWID, AUTHOR, BODY
FROM   TABLE_NAME
ORDER BY AUTHOR, BODY, POINTS DESC

然后在你的Python应用程序中,遍历你的结果集,并存储作者/身体组合的所有非第一个ROWID(想想CTRL-BREAK样式编程),一旦你完成构建你的集合删除行ID

答案 1 :(得分:1)

由于您要删除除最高点之外的所有值,以下内容将完全正确:

delete from test
  where exists (select * from test t2
                where test.author = t2.author
                and test.body = t2.body
                and test.points < t2.points);

它是自身的基本连接,然后删除所有具有相同作者和值的值。身体,但具有较低的分值。

SqlFiddle:http://sqlfiddle.com/#!7/64d62/3

注意:一个警告是,如果多个作者/身体对具有相同的最大点值,则将保留所有这些值。

答案 2 :(得分:0)

我还没有测试过,但可以工作:

DELETE FROM TableName
    WHERE author, body, points NOT IN (SELECT author, body, MAX(points) as points
        FROM TableName 
    GROUP BY author, body)

首先将其作为SELECT查询运行,看它是否会保留您想要的内容。