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

Откуда:
Сообщений: 79
всем привет

Есть таблица с импортированными данными - главная сущность и связанная таблица с ее атрибутами.
Нужно реализовать проверку, что в базе еще нет сущности с таким же названием и набором атрибутов.
Набор атрибутов представлен в отдельной таблице как пара название критерия - значение
Наличие атрибутов не обязательно.

Находим сущности в базе, совпадающие по названию с импортируемой строкой.
сравниваем атрибуты каждой такой сущности с импортируемыми, и если множество атрибутов импортированной сущности полностью входит в множество существующих атрибутов, то такую сущность должны вернуть как дубликат.
При этом в импорте может быть меньше атрибутов (если не все атрибуты импортируются) чем в атрибутах в базе, но не наоборот.

вопрос, можно ли данную задачу решить с помощью запроса не прибегая к использованию курсора?
Если да, то подскажите как это можно осуществить?

нужные для сравнения данные из импорта:
;with import_data
as (
select
main_tmp.row_id, // номер строки импорта, нужно отобразить в какой строке дубликат
main_tmp.main_id, // id главной сущности, может быть не указано
main_tmp.main_name,
criteria_tmp.criteria_name,
criteria_tmp.criteria_value
from
main_tmp
left join
criteria_tmp
on main_tmp.[row_id] = criteria_tmp.[row_id]
)

нужные для сравнения данные из базы:
with existing_data
as (
select
main.main_id,
main.main_name,
main_criteria.criteria_name,
main_criteria.criteria_value
from
main
inner join
import_data
on import_data.main_name = main.main_name
and (import_data.main_id is null or
import_data.main_id <> main.main_id)
left join
main_criteria
on main.main_id = main_criteria.main_id
)
12 янв 18, 20:49    [21103120]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов  [new]
Добрый Э - Эх
Guest
Тэй,

на первый взгляд задача на "реляционное деление". одним запросом решается. причем, больше чем одним способом...
12 янв 18, 20:52    [21103127]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Тэй,

как пример:
declare @t1 table (id int, p int, v int)
declare @t2 table (id int, p int, v int)

insert @t1(id, p, v) values (1,1,1),(1,2,2),(1,3,3),(2,1,1),(2,2,3),(3,1,1)
insert @t2(id, p, v) values (1,1,1),(1,2,2),(1,3,3),(2,1,1),(2,2,2)

select
	t1.*,
	case when count(t1.id)over(partition by t1.id)=count(t2.id)over(partition by t2.id) then 1 else 0 end as [дубликат]
from
	@t1 t1
	left join @t2 t2 on
		t2.id=t1.id and
		t2.p=t1.p and
		t2.v=t1.v
order by
	t1.id
12 янв 18, 22:04    [21103392]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов  [new]
Тэй
Member

Откуда:
Сообщений: 79
Дедушка,

спасибо за пример, благодаря ему все получилось.
13 янв 18, 01:37    [21103707]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить