pysqlite, запрос на дубликаты записей с замененными столбцами - PullRequest
1 голос
/ 26 февраля 2010

В настоящее время у меня есть pysqlite db, который я использую для хранения списка дорожных условий. Источник, из которого генерируется этот список, однако является ошибочным и иногда генерирует дубликаты. У некоторых из этих дубликатов начальная и конечная точки будут поменяны местами, но все остальное будет таким же.

Метод, который у меня сейчас есть, выглядит следующим образом:

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 голосов
/ 27 февраля 2010

Вместо первого запроса вы можете использовать

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;

Но этот подход работает, только если не имеет значения, какой именно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...