pysqlite,查询具有交换列的重复条目

时间:2010-02-26 20:28:11

标签: python sql sqlite

目前我有一个用于存储道路状况列表的pysqlite数据库。但是,此列表生成的源是错误的,有时会生成重复项。其中一些重复项将交换起点和终点,但其他一切都相同。

我目前的方法如下:

def getDupes(self):
    '''This method is used to return a list of dupilicate entries 
    '''
    self.__curs.execute('SELECT * FROM roadCond GROUP BY road, start, end, cond, reason, updated, county, timestmp HAVING count(*)>1')
    result = self.__curs.fetchall()

    def getSwaps():
        '''This method is used to grab the duplicates with swapped columns
        '''
        self.__curs.execute('SELECT * FROM roadCond WHERE ')
        extra = self.__curs.fetchall()
        return extrac

    result.extend(getSwaps())

    return result

初始查询有效,但我对此表示怀疑(我认为有一种更好的方法,我只是不知道)但我并不是都知道如何使内部方法有效。

提前谢谢你。 :-D

1 个答案:

答案 0 :(得分:0)

您可以使用

代替第一个查询
SELECT DISTINCT * FROM roadCond

将检索表中的所有记录,删除任何重复项。

对于内部方法,此查询将返回所有已交换startend的“重复”的记录。请注意,对于每个带有“重复”的记录,此查询将同时返回“原始”和“副本”。

SELECT DISTINCT * FROM roadCond WHERE EXISTS (
    SELECT * FROM roadCond rc2 WHERE
        roadCond.road = rc2.road AND
        roadCond.end = rc2.start AND roadCond.start = rc2.end AND
        roadCond.cond = rc2.cond AND
        ... AND
        roadCond.timestamp = rc2.timestamp)

修改:要检查并删除startend交换的“重复项”,您可以确保您的数据始终包含按相同顺序排列的这些值:

UPDATE roadCond SET start = end, end = start WHERE end < start;

但这种方法只有在无关紧要的情况下才有效。