SQL найти возможные дубликаты - PullRequest
2 голосов
/ 25 августа 2009

Мне нужен код SQL, который идентифицирует возможные дубликаты в таблице. Допустим, в моей таблице 4 столбца:

  • ID (первичный ключ)

  • Date1

  • Дата2

  • GroupID

(Date1, Date2, GroupID) образуют уникальный ключ.

Эта таблица заполняется блоками данных одновременно, и часто случается, что в нее загружается новый блок, содержащий несколько записей, которые уже находятся там. Это нормально, пока их ловит уникальный ключ. К сожалению, иногда Дата1 пуста (или, по крайней мере, «1900/01/01») при первой или последующих загрузках.

Так что мне нужно что-то, чтобы определить, где комбинация (Date2, GroupID) появляется более одного раза и где для одна записей Date1 = '1900/01/01'

Спасибо

Karl

Ответы [ 7 ]

2 голосов
/ 25 августа 2009

bkm вроде есть, но внутренний выбор может работать плохо в некоторых базах данных. Это более просто:

select t1.* from 
t as t1 left join t as t2 
on (t1.date2=t2.date2 and t1.groupid=t2.groupid)
where t1.id != t2.id and (t1.date1='1900/01/01' or t2.date2='1900/01/01')
1 голос
/ 25 августа 2009

Если я правильно понимаю, вы ищете группу идентификаторов, для которых GroupID и Date2 совпадают, есть одно вхождение Date1, которое отличается от 1900/01/01, а все остальные Date1s - 1900/01 / 01.

Если я правильно понял, вот запрос для вас:

SELECT T.ID 
FROM Table T1
WHERE 

(T1.GroupID, T1.Date2) IN
    (SELECT T2.GroupID, T2.Date2
    WHERE T2.Date1 = '1900/01/01' OR
        T2.Date IS NULL
    GROUP BY T2.GroupID, T2.Date2)

AND 

1 >= 
(
    SELECT COUNT(*) 
    FROM TABLE T3
    WHERE NOT (T3.Date1 = '1900/01/01') 
    AND NOT (T3.Date1 IS NULL)
    AND T3.GroupID = T1.GroupID
    AND T3.Date2 = T1.Date2
)

Надеюсь, это поможет.

1 голос
/ 25 августа 2009

Вы можете идентифицировать дубликаты (date2, GroupID), используя

Select date2,GroupID
from t
group by (date2,GroupID)
having count(*) >1

Используйте это для идентификации записей в основной таблице, которые являются дубликатами:

Select *
from t
where date1='1900/01/01'
and (date2,groupID) = (Select date2,GroupID
                       from t
                       group by (date2,GroupID)
                       having count(*) >1)

ПРИМЕЧАНИЕ. Поскольку Date1, Date2, GroupID образуют уникальный ключ, проверьте, правильно ли ваш дизайн, позволяя Date1 иметь значение NULL. Вы можете иметь подлинный случай, когда Дата 1 отличается для двух строк, в то время как (дата2, GroupID) совпадает

0 голосов
/ 25 августа 2009

Это самый простой способ сделать это:

SELECT DISTINCT t1.*
FROM t t1 JOIN t t2 USING (date2, groupid)
WHERE t1.date1 = '1900/01/01';

Не нужно использовать GROUP BY, что плохо работает с базой данных некоторых брендов.

0 голосов
/ 25 августа 2009
select * from table a
join (
select Date2, GroupID, Count(*)
from table
group by Date2, GroupID
having count(*) > 1
) b on (a.Date2 = b.Date2 and a.GroupID = b.GroupID)
where a.Date1 = '1900/01/01'
0 голосов
/ 25 августа 2009

Помимо того, что в таблице определено поле PRIMARY KEY, вы также можете добавить другие УНИКАЛЬНЫЕ ограничения, чтобы выполнить то же самое, о чем вы просите. Они подтвердят, что конкретный столбец или набор столбцов имеют уникальное значение в таблице.

Проверьте запись в руководстве MySQL для примера:

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

0 голосов
/ 25 августа 2009

Возможно, ограничение проверки.

Что-то вроде select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid.

Просто нужно посмотреть, сможете ли вы сделать это в ограничении на уровне таблицы ....

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