2009-08-25 7 views
2

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

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

  • DATE1

  • Дата2

  • GroupID

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

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

Так что мне нужно что-то, чтобы определить, где (Дата2, GroupID) сочетание более одного раза, и где для одной из записей DATE1 = «1900/01/01»

Благодаря

Karl

+0

Если у вас несколько записей с датой 1, являющейся 1900/01/01, а Date2 и GroupID одинаковой, считается ли она множественной? Я бы предположил, что это ... –

+0

в этом случае это не будет проблемой - проблема будет только в том случае, если Date1 является 1900/01/01 в одной загрузке, но имеет значение в другом – Karl

+0

Я имел в виду, если у вас несколько записей с Date1 - 1900/01/01, а Date2 и GroupID - одинаковыми, но один Date1 имеет значение (с теми же Date2 и GroupID). –

ответ

2

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') 
+0

работает отлично, нужно просто выбрать DISTINCT t1. * ..... – Karl

0

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

Что-то вдоль линий select count(*) where date1 = '1900/01/01' and date2 = @date2 and groupid = @groupid.

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

+0

С некоторым примером кода я думаю, что это ответ. – Cellfish

0

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

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

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

1

Вы можете определить дубликаты на (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 различна для двух строк в то время как (date2, GroupID) тот же

+0

К сожалению, я должен учитывать тот факт, что информация о дате не может быть доступна для Date1 – Karl

0
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' 
1

Если я правильно понимаю, вы ищете группу идентификаторов, для которых GroupID и Дата2 являются То же самое, есть одно событие Date1, которое отличается от 1900/01/01, а все остальные Date1 - 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 
) 

Надежда, что помогает.

0

Это самый простой способ, которым я могу думать, чтобы сделать это:

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

Нет необходимости использовать GROUP BY, которая выполняет плохо на некоторых марках базы данных.