greatwhite1 Ответов: 1

Выбор дублирующих записей


Привет новичку на этом сайте, надеюсь, что кто-то сможет помочь мне с этим вопросом SQL.

Итак, у меня есть таблица под названием T_EE_EVALUATIONS, в которой есть повторяющиеся записи. Таблица имеет следующую структуру ниже. Мне нужно найти дубликат адреса, где house_id не совпадает с его дубликатом адреса. Ни один из идентификаторов не является P-ключами. Я попробовал это сделать, но на самом деле это работает не так, как я хочу.
Select E.eval_id , E.house_id , E.ClientCity, E.ClientAddr, E.Houseregion, T.eval_id , T.house_id, T.ClientCity , T.ClientAddr , T.Houseregion
From T_EE_EVALUATIONS E INNER JOIN
(Select eval_id , house_id,ClientCity, ClientAddr, Houseregion, COUNT(*) AS CountOf
FROM T_EE_EVALUATIONS GROUP BY eval_id , house_id,ClientCity, ClientAddr, Houseregion-- HAVING COUNT(*)>1
) T
ON E.ClientCity || E.ClientAddr || E.Houseregion = T.ClientCity || T.ClientAddr || T.Houseregion
eval_id  house_id  ClientCity  ClientAddr      Houseregion
------------------------------------------------------------
12345    56455     Quebec      34 Anyplace     Quebec
12345    23765     Quebec      34 Anyplace     Quebec
12345    94213     Quebec      34 Anyplace     Quebec
13456    23456     Russell     214 mystreet    Ontario
13456    33456     Russell     214 mystreet    Ontario
14526    14567     Quispamsis  456 Thatstreet  New Brunswick
14526    13567     Quispamsis  456 Thatstreet  New Brunswick


Что я уже пробовал:

Select E.eval_id , E.house_id , E.ClientCity, E.ClientAddr, E.Houseregion, T.eval_id , T.house_id, T.ClientCity , T.ClientAddr , T.Houseregion
From T_EE_EVALUATIONS E INNER JOIN
(Select eval_id , house_id,ClientCity, ClientAddr, Houseregion, COUNT(*) AS CountOf
FROM T_EE_EVALUATIONS GROUP BY eval_id , house_id,ClientCity, ClientAddr, Houseregion-- HAVING COUNT(*)>1
) T
ON E.ClientCity || E.ClientAddr || E.Houseregion = T.ClientCity || T.ClientAddr || T.Houseregion

ZurdoDev

Не группируйте по house_id, потому что это не является частью повторяющихся данных.

greatwhite1

Как включить house_id? Я должен иметь это, чтобы я мог видеть, если house_id отличается

ZurdoDev

Один из способов - использовать производную таблицу. Ваша производная таблица извлекает группы только по адресу, а затем присоединяется обратно к нему на основе полей адреса.

Если вы хотите удалить все, кроме одного для каждого дома, есть простые скрипты, которые вы можете найти в интернете, чтобы сделать это.

greatwhite1

Нет, как только я найду записи, я не буду их удалять, они должны обновить свой house_id до оригинала. Насколько я понимаю , прежде чем я начал здесь что-то заставило некоторые адреса получить новый идентификатор дома, дубликаты данных-это нормально, но все они должны иметь один и тот же идентификатор дома. Я знаю, что это странно, но я не строил его, просто должен жить с этим.

ZurdoDev

1. ответьте на комментарий так, чтобы я был уведомлен вместо того, чтобы публиковать новый комментарий.
2. Сделайте что-нибудь вроде этого
ВЫБИРАТЬ *
Из таблицы Т
ЛЕВОЕ СОЕДИНЕНИЕ
(
Выберите addr1, addr2, ...
из таблицы
Группировка по addr1, addr2, ...
Имея COUNT(*) > 1
) x на t.addr1 = x.addr1 и t.addr2 = x.addr2, ...

greatwhite1

Пробовал решения и пытался модифицировать их в соответствии с моими потребностями. Я начинаю думать, что то, что я пытаюсь сделать, может оказаться невозможным.

Мне нужен каждый адрес, который является дубликатом. и мне нужны именно eval_id и house_id. Как только я выделю их, я рассмотрю их, чтобы понять, почему они являются дубликатами. Текущие запросы не могут быть правильными, потому что возврат записей больше, чем это возможно.

1 Ответов

Рейтинг:
2

Maciej Los

Попробуйте получить все дубликаты для конкретного eval_id а потом присоединиться house_id:

SELECT t1.*, t2.house_id 
FROM 
(
    SELECT eval_id, ClientCity, ClientAddr, Houseregion
    FROM T_EE_EVALUATIONS 
    GROUP BY eval_id, ClientCity, ClientAddr, Houseregion
    HAVING COUNT(*)>1
) AS t1 INNER JOIN T_EE_EVALUATIONS AS t2 ON t1.eval_id = t2.eval_id AND t1.ClientCity = t2.ClientCity AND t1.ClientAddr = t2.ClientAddr AND  t1.Houseregion = t2.Houseregion