Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
Добрый вечер.
Проблема в следующем. Есть MSSQL2008R2. Есть база с информацией по неким объектам.Инфа хранится, скажем, в двух таблицах.
Адрес(поля: id,улица,дом) и Контакт(поля: id,ФИО,тел). Связь по id.
Необходимо найти одинаковые записи. Сам в sql не очень-то разбираюсь, на начальном уровне, поиск в гугле и на сайте натолкнул на это.

select Wh.*
from Адрес Wh
RIGHT OUTER JOIN
(select улица,дом
from Адрес Wh group by улица,дом having count(*) > 1) Wh2
ON Wh.улица=Wh2.улица
AND Wh.дом=Wh2.дом
Where Wh.улица is not null

но это поиск по одной таблице. Теперь никак не пойму как сделать так, что бы выбрались те записи у которых одинаковая инфа по обеим таблицам(вообще их шесть).
29 май 11, 17:24    [10727387]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DINF
Добрый вечер.
Проблема в следующем. Есть MSSQL2008R2. Есть база с информацией по неким объектам.Инфа хранится, скажем, в двух таблицах.
Адрес(поля: id,улица,дом) и Контакт(поля: id,ФИО,тел). Связь по id.
Необходимо найти одинаковые записи. Сам в sql не очень-то разбираюсь, на начальном уровне, поиск в гугле и на сайте натолкнул на это.

select Wh.*
from Адрес Wh
RIGHT OUTER JOIN
(select улица,дом
from Адрес Wh group by улица,дом having count(*) > 1) Wh2
ON Wh.улица=Wh2.улица
AND Wh.дом=Wh2.дом
Where Wh.улица is not null

но это поиск по одной таблице. Теперь никак не пойму как сделать так, что бы выбрались те записи у которых одинаковая инфа по обеим таблицам(вообще их шесть).
Если таблицы Адрес и Контакт связаны по id, то почему это не одна таблица?
Чтобы было однозначное понимание, выкладывайте скрипты CREATE TABLE для обеих таблиц.
29 май 11, 17:37    [10727417]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
Вопрос очень справедливый.
Потому что на самом деле таблиц не две, а шесть на каждый тип объекта. и они по десятку полей, вот поэтому разработчиком бд было решено сделать несколько таблиц.
29 май 11, 17:41    [10727422]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
[/quot]Чтобы было однозначное понимание, выкладывайте скрипты CREATE TABLE для обеих таблиц.[/quot]

На сколько я знаю создано было все в конструкторе, без каких-либо заморочек.
29 май 11, 17:42    [10727425]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
Вроде как придумал что-то типа такого:


select Wh.*
from Контакт Wh
RIGHT OUTER JOIN
(select ФИО1,Тел1
from Контакт Wh group by ФИО1,Тел1 having  count(*) > 1) Wh2
ON Wh.ФИО1=	Wh2.ФИО1 
AND Wh.Тел1=Wh2.Тел1

RIGHT OUTER JOIN

(select addr.*
from Адрес addr
RIGHT OUTER JOIN
(select улица,Дом
from Адрес addr group by улица,Дом having  count(*) > 1) addr2
ON addr.улица=addr2.улица 
AND addr.Дом=addr2.Дом) as T

on Wh.id=t.Id
where Wh.ID is not null
29 май 11, 17:50    [10727435]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
DINF
Вроде как придумал что-то типа такого:


select Wh.*
from Контакт Wh
RIGHT OUTER JOIN
(select ФИО1,Тел1
from Контакт Wh group by ФИО1,Тел1 having  count(*) > 1) Wh2
ON Wh.ФИО1=	Wh2.ФИО1 
AND Wh.Тел1=Wh2.Тел1

RIGHT OUTER JOIN

(select addr.*
from Адрес addr
RIGHT OUTER JOIN
(select улица,Дом
from Адрес addr group by улица,Дом having  count(*) > 1) addr2
ON addr.улица=addr2.улица 
AND addr.Дом=addr2.Дом) as T

on Wh.id=t.Id
where Wh.ID is not null

Но почему-то не все находит, где-то ошибка. Подскажите, пожалуйста?
29 май 11, 20:19    [10727800]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
Но почему-то не все находит, где-то ошибка. Подскажите, пожалуйста?


если есть значения NULL,то пропускает. Знаю есть функции IS NULL и IS NOT NULL, только вот не знаю куда надо добавить.
29 май 11, 20:58    [10727918]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
iljy
Member

Откуда:
Сообщений: 8711
DINF,

тихо сам с собою я веду беседу

https://www.sql.ru/forum/actualthread.aspx?tid=127456
29 май 11, 21:24    [10727998]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
iljy
DINF,

тихо сам с собою я веду беседу

https://www.sql.ru/forum/actualthread.aspx?tid=127456


Ну а что еще делать, если за сутки только твой ответ :-)
30 май 11, 23:44    [10735532]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
iljy
Member

Откуда:
Сообщений: 8711
DINF
iljy
DINF,

тихо сам с собою я веду беседу

https://www.sql.ru/forum/actualthread.aspx?tid=127456


Ну а что еще делать, если за сутки только твой ответ :-)

Рекомендации выполнить? Пункт 6 например.
31 май 11, 00:33    [10735693]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
homyak
Member

Откуда: msk
Сообщений: 10
DINF
iljy
DINF,

тихо сам с собою я веду беседу

https://www.sql.ru/forum/actualthread.aspx?tid=127456


Ну а что еще делать, если за сутки только твой ответ :-)


Удалось решить? Если нет - то что именно требуется? Найти контакты, по которым есть абсолютно идентичные записи в таблицах связанных (несколько одинаковых адресов, контактов, еще чего-то по id)?
3 июн 11, 12:11    [10758079]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
DINF
Member

Откуда: Краснодар
Сообщений: 70
homyak
Удалось решить? Если нет - то что именно требуется? Найти контакты, по которым есть абсолютно идентичные записи в таблицах связанных (несколько одинаковых адресов, контактов, еще чего-то по id)?




Да именно, необходимо найти абсолютно одинаковые записи.


Еще раз запрос:

SET ANSI_NULLS ON
select Wh.*,T.*
from Контакт Wh
RIGHT OUTER JOIN
(select ФИО1,ФИО2,ФИО3,Тел1,Тел2,Тел3
from Контакт Wh group by ФИО1,ФИО2,ФИО3,Тел1,Тел2,Тел3 having  count(*) > 1) Wh2
ON Wh.ФИО1=				Wh2.ФИО1 
AND Wh.ФИО2=			Wh2.ФИО2
AND Wh.ФИО3=			Wh2.ФИО3
AND Wh.Тел1=			Wh2.Тел1
AND Wh.Тел2=			Wh2.Тел2


RIGHT OUTER JOIN

(select addr.*
from Адрес addr
RIGHT OUTER JOIN
(select краснодар,город,район,пересечение,улица,Дом,Корпус,[Площадь общая],[Площадь жилая],[Площадь кухни]
from Адрес addr group by краснодар,город,район,пересечение,улица,Дом,Корпус,[Площадь общая],[Площадь жилая],[Площадь кухни] having  count(*) > 1) addr2
ON (addr.улица=			addr2.улица)
AND addr.краснодар=		addr2.краснодар
AND addr.город=			addr2.город
AND addr.район=			addr2.район
AND addr.пересечение=	addr2.пересечение
AND addr.улица=			addr2.улица
AND addr.Дом=			addr2.Дом
AND addr.Корпус=		addr2.Корпус
AND addr.[Площадь общая]=addr2.[Площадь общая]
AND addr.[Площадь жилая]=addr2.[Площадь жилая]
AND addr.[Площадь кухни]=addr2.[Площадь кухни]
) as T

on Wh.id=t.Id
where Wh.ID is not null

Структуры таблиц прилагаю.

Результат выполнения запроса зависит от полей с содержанием Null / не Null. Пример прилагаю.

Если что не так звиняйте)

К сообщению приложен файл. Размер - 127Kb
4 июн 11, 22:25    [10764077]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
Glory
Member

Откуда:
Сообщений: 104751
DINF
Результат выполнения запроса зависит от полей с содержанием Null / не Null. Пример прилагаю.

разумеется зависит. Поэтому и проверяйте значения Null отдельно
5 июн 11, 11:50    [10764543]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
DINF, чтобы разобраться, попробуйте менять значения @a и @b

DECLARE @a nvarchar(10)
DECLARE @b nvarchar(10)
SET @a=NULL
SET @b=NULL --'tst'

SELECT CASE WHEN @a=@b THEN 'равны' ELSE 'хз' END
, CASE WHEN @a<>@b THEN 'неравны' ELSE 'хз' END
, CASE WHEN @a>@b THEN 'больше' ELSE 'хз' END
, CASE WHEN ISNULL(@a,'строка')<=ISNULL(NULL,'строка') THEN 'меньше равно чем строка' ELSE 'не меньше равно чем строка' END
, CASE WHEN @a IS NULL THEN '100% @a NULL' ELSE '100% @a не NULL' END
, CASE WHEN NOT @b IS NULL THEN '100% @b не NULL' ELSE '100% @b NULL' END
5 июн 11, 12:52    [10764653]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
homyak
Member

Откуда: msk
Сообщений: 10
DINF,

Ну так а в куске с проверкой если добавить isnull в соответствии с типом?
Чтобы получилось как-то так:

ON isnull(Wh.ФИО1,'')= isnull(Wh2.ФИО1 ,'')
AND isnull(Wh.ФИО2,'')= isnull(Wh2.ФИО2,'')
AND isnull(Wh.ФИО3,'')= isnull(Wh2.ФИО3,'')
AND isnull(Wh.Тел1,'')= isnull(Wh2.Тел1,'')
AND isnull(Wh.Тел2,'')= isnull(Wh2.Тел2,'')

Правда тогда схлопнутся с null и с пустой строкой ''
7 июл 11, 15:47    [10939857]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ON NOT EXISTS
(
 SELECT Wh.ФИО1,Wh.ФИО2,Wh.ФИО3,Wh.Тел1,Wh.Тел2
 INTERSECT
 SELECT Wh2.ФИО1,Wh2.ФИО2,Wh2.ФИО3,Wh2.Тел1,Wh2.Тел2
)
7 июл 11, 15:55    [10939911]     Ответить | Цитировать Сообщить модератору
 Re: Поиск дубликатов по нескольким таблицам  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
ON NOT EXISTS
(
 SELECT Wh.ФИО1,Wh.ФИО2,Wh.ФИО3,Wh.Тел1,Wh.Тел2
 INTERSECT
 SELECT Wh2.ФИО1,Wh2.ФИО2,Wh2.ФИО3,Wh2.Тел1,Wh2.Тел2
)
Грубо ошибся!
ON EXISTS
(
 SELECT Wh.ФИО1,Wh.ФИО2,Wh.ФИО3,Wh.Тел1,Wh.Тел2
 INTERSECT
 SELECT Wh2.ФИО1,Wh2.ФИО2,Wh2.ФИО3,Wh2.Тел1,Wh2.Тел2
)
Надо ведь, чтобы все поля были равны друг другу
7 июл 11, 20:02    [10941519]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить