2010-02-26 4 views
1

Actuellement, j'ai une base de données pysqlite que j'utilise pour stocker une liste des conditions routières. La source de cette liste est cependant buggée et génère parfois des doublons. Certains de ces doublons auront les points de départ et d'arrivée échangés, mais tout le reste sera identique.pysqlite, recherche d'entrées en double avec des colonnes permutées

La méthode que j'ai actuellement ressemble à ceci:

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 

Les travaux de la requête initiale, mais je me méfie de lui (je pense qu'il ya une meilleure façon, je ne sais pas seulement) mais je suis pas tout à fait sûr comment faire fonctionner la méthode intérieure.

Merci d'avance. :-D

Répondre

0

Au lieu de la première requête, vous pouvez utiliser

SELECT DISTINCT * FROM roadCond 

qui récupérera tous les enregistrements de la table, en supprimant les doublons. Comme pour la méthode interne, cette requête renverra tous les enregistrements qui ont des "doublons" avec start et end échangés. Notez que, pour chaque enregistrement avec "doublons", cette requête retournera à la fois "l'original" et la "copie".

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) 

Edit: pour détecter et supprimer « doublons » avec start et end troqué, vous pouvez vous assurer que vos données contiennent toujours ces valeurs établies dans le même ordre:

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

Mais cette approche ne fonctionne que si elle n'a pas d'importance.

+0

Donc ce que je veux, c'est une liste des éléments en double à renvoyer plutôt que la liste, avec les éléments en double supprimés. En fin de compte, j'aimerais que les éléments en double soient supprimés de la table afin qu'ils n'apparaissent pas dans les requêtes futures. De plus, les données sont générées semi-automatiquement. Parfois, cependant, il devient foiré et les entrées en double sont créées là où je racle des valeurs. Donc, je n'ai aucun moyen de connaître la météo ou non les doublons ont même échangé des valeurs avant de les mettre dans la base de données parce que j'essaie d'utiliser une requête pour les déterminer et les récupérer Merci. –

Questions connexes