SQL删除重复行

2024-10-01 09:19:32 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
Delete duplicate rows

这是我的表结构:

“作者”(varchar)|“点”(整数)|“正文”(文本)

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

我使用的是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

我也试过这个,但没用。在

^{pr2}$

我也在做所有的改变,所以不是这样。SQLite3模块安装正确,我可以在数据库上写。在


Tags: and数据库body作者sqlite3authorrowsrow
3条回答

不幸的是,在SQLite3中,您没有像partition over row这样的好函数,因此无法在一个查询中完成它,所以您要么按程序执行,要么迭代执行。在

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

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

然后在Python应用程序中,遍历结果集,并存储Author/Body组合框的所有非第一行id(考虑CTRL-BREAK样式编程),一旦构建完集合,就删除行id。在

由于您要删除除最高点之外的所有值,以下操作将很好地完成:

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

注意:一个警告是,如果多个author/body对具有相同的max point值,那么所有这些值都将被保留。在

我还没有测试过,但这可能会起作用:

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

首先以SELECT查询的形式运行它,看看它是否能保持您想要的结果。在

相关问题 更多 >