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

Откуда:
Сообщений: 325
Есть таблица A с первичным ключом id, и связанная с ней таблица B, где поле B.parent ссылается на A.id (связь один-к-нескольким).
Нужно найти все записи из A, у которых полностью совпадает содержимое B. Причем в B есть порядок записей и порядок важен при сравнении.

На примере будет понятнее:
create table #a (id nvarchar(5) not null primary key)
go

create table #b (parent nvarchar(5) not null, data nvarchar(max) not null, ordr int identity (1,1))
go

insert #a values
('a'),
('b'),
('c'),
('d'),
('e'),
('f')

insert #b (parent, data)
values
('a', 'first'),
('a', 'second'),

('b', 'first'),
('b', 'second'),

('c', 'second'),
('c', 'first'),

('d', 'first'),
('d', 'second'),
('d', 'third')
go


Тут должно найтись a-b и e-f, но не a-c или a-d.

Приходит на ум только способ пронумеровать их и сравнить по этому номеру:
select *
from #a la, #a ra
where la.id < ra.id
and not exists
(
	select *
	from
	(
		select data, DENSE_RANK() over (order by ordr) rnk
		from #b
		where parent = la.id
	) lb
	full join
	(
		select data, DENSE_RANK() over (order by ordr) rnk
		from #b
		where parent = ra.id
	) rb
	on lb.rnk = rb.rnk
	where (lb.data != rb.data)
	or (lb.data is null and rb.data is not null)
	or (lb.data is not null and rb.data is null)
)


Нормальный способ? Есть ли другие варианты?
Нужно решение для 2005+
7 июл 14, 19:27    [16271630]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных в связанной таблице  [new]
sraider
Member

Откуда:
Сообщений: 325
забыл еще одно условие - в поле B.ordr могут быть пропуски в любом месте. полагаться на четкую последовательность в этом поле нельзя, только на порядок
7 июл 14, 19:33    [16271642]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных в связанной таблице  [new]
gandjustas
Member

Откуда:
Сообщений: 857
Блог
sraider,

ROW_NUMBER вместо DENSE_RANK и надо отфильтровать значения из A, для которых нету записей в B
7 июл 14, 21:48    [16272055]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить