Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов / 4 сообщений из 4, страница 1 из 1
12.01.2018, 20:49
    #39583540
Тэй
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов
всем привет

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

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

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

нужные для сравнения данные из импорта:
;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
)
...
Рейтинг: 0 / 0
12.01.2018, 20:52
    #39583542
Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов
Тэй,

на первый взгляд задача на "реляционное деление". одним запросом решается. причем, больше чем одним способом...
...
Рейтинг: 0 / 0
12.01.2018, 22:04
    #39583564
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов
Тэй,

как пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
13.01.2018, 01:37
    #39583599
Тэй
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов
Дедушка,

спасибо за пример, благодаря ему все получилось.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запрос на поиск дупликатов среди данных двух таблиц с учетом связанных с ними атрибутов / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]