目前我有一个用于存储道路状况列表的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
答案 0 :(得分:0)
您可以使用
代替第一个查询SELECT DISTINCT * FROM roadCond
将检索表中的所有记录,删除任何重复项。
对于内部方法,此查询将返回所有已交换start
和end
的“重复”的记录。请注意,对于每个带有“重复”的记录,此查询将同时返回“原始”和“副本”。
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)
修改:要检查并删除start
和end
交换的“重复项”,您可以确保您的数据始终包含按相同顺序排列的这些值:
UPDATE roadCond SET start = end, end = start WHERE end < start;
但这种方法只有在无关紧要的情况下才有效。