Отлов двойников
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Отлов двойников Expand / Collapse
Автор
Сообщение
30.08.2006 22:46
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 17.07.2008 15:32
Сообщ.: 51, Visits: 403
Доброго времени суток!

Задавал вопрос в форуме по Access'у, но не получил ответа:-(. Может здесь кто знает! Просветите меня в таком вопросе: Есть организация с филиалами, в каждом филиале - подразделения, в каждом подразделении - отделы. Задача-максимум: показать для каждого отдела записи с дубликатами (в других отделах, подразделениях, филиалах). Типа показать все записи для ИВАНОВ ИВАН ИВАНОВИЧ, который может быть зафиксирован в разных отделах. В конструкторе запросов есть мастер ПОВТОРЯЮЩИЕСЯ ЗАПИСИ, но он работает для всей организации. Если я его модифицирую (вставляю условие отбора) хотя бы для филиала, то он выдает записи-дубликаты только для филиала, а из других филиалов записи не показываются. Т.е. вижу, что дубликаты есть (т.к. запись из данного филиала туда попадает), но не вижу - где :-(. Сейчас использую brute force - влобовую в цикле иду по отделу и для каждого запросом ищу двойников, если нахожу, сбрасываю во временную таблицу. Но спинным мозгом чую, что должно быть что-то такое белое, воздушное, легкое ((с) йогурт:-). Помогите кто чем...

С уваженим, Анатолий

Сообщ. #903631
30.08.2006 23:20


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 29.10.2007 14:45
Сообщ.: 1 833, Visits: 16 863
Запутано написано.

Приведите структуру таблиц(ы). Полагаю, скорее всего в данном случае подойдет группировка со сравнением Count(fld) с Count(DISTINCT fld), но для точного ответа - приведите скрипт создания таблиц(ы) и пример нескольких строк.

Сообщ. #903632
31.08.2006 0:32
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

администратор
Last Login: 13.11.2007 13:41
Сообщ.: 4 421, Visits: 49 251
select * from table t1
where id not in (
 select min(t2.id)
 from table t2
 where 
 and t2.field1=t1.field1
group by t2.field1)
Сообщ. #903633
02.09.2006 13:44
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 17.07.2008 15:32
Сообщ.: 51, Visits: 403
Доброго времени суток!

Попробую на примерах :-). Есть три таблицы - Ab, Direct, Fac.  Ab - таблица личных данных, она связана по полю DirectID с таблицей отделов Direct. Таблица Direct связана по полю FacID с таблицей подразделений Fac. Есть ещё таблица филиалов HS,  таблица Fac связана с ней по полю HSID. Я хочу увидеть людей, которые зафиксированы в разных отделах\подразделениях\филиалах (имеется более одной записи с совпадающими фамилией, именем и отчеством). Построитель создает такой запрос :

SELECT Ab.LastName, Ab.FirstName, Ab.MidName, Ab.DirectID
FROM Ab
WHERE (((Ab.LastName) In (SELECT [LastName] FROM [Ab] As Tmp GROUP BY [LastName],[FirstName],[MidName] HAVING Count(*)>1  And [FirstName] = [Ab].[FirstName] And [MidName] = [Ab].[MidName])))
ORDER BY Ab.LastName, Ab.FirstName, Ab.MidName;

Этот запрос показывает все дубликаты во всех филиалах. Но мне нужно, например, увидеть записи, находящиеся в одном филиале (например, с HSID=1), и где уних двойники. (Т.е. если есть дубликаты в филиале 2, которых нет в филиале 1, я их не хочу видеть). Модифицирую запрос :

SELECT DISTINCTROW Ab.LastName, Ab.FirstName, Ab.MidName,  Ab.DirectID, Fac.SmallName
FROM (Fac INNER JOIN Direct ON Fac.FacID = Direct.FacID) INNER JOIN Ab ON Direct.DirectID = Ab.DirectID
WHERE (((Ab.LastName) In (SELECT [LastName] FROM [Ab] As Tmp GROUP BY [LastName],[FirstName] HAVING Count(*)>1  And [FirstName] = [Ab].[FirstName] )) AND ((Fac.HSID)=1))
ORDER BY Ab.LastName, Ab.FirstName;

Но при этом я вижу дубликаты, находящиеся только в филиале 1. Если у записи в филиале 1 есть дубликат в филиале 2, то запись из филиала 2 не показывается (только из филиала 1) :-( Таким образом, я вижу, что дубликат есть, но не вижу, где :-( . Поэтому и прошу подсказать, может есть более изящное решение :-)

С уважением, Анатолий

Сообщ. #903772
15.09.2006 23:24
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.10.2007 4:11
Сообщ.: 219, Visits: 1 804
Попробцй так

SELECT a1.LastName, a1.FirstName, a1.MidName, a1.DirectID
FROM Ab a1, (
 select count(*), a2.DirectID from Ab a2 group by a2.DirectID having count(*)>1
) a3
where a1.DirectID=a3.DirectID

Вроде как должно работать, го проверить мне не на чем

Сообщ. #904470
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 11:01