Сложное удаление повторяющихся данных в таблице M-N

bizonok
Дата: 16.01.2009 00:14:54
Дана таблица m2n со следующей структурой и данными:
declare @m2n table(m int, n int, id int)
insert into @m2n(m, n, id)
select 1, 1, 1 union all
select 2, 1, 2 union all
select 1, 1, 3 union all
select 4, 2, 4 union all
select 2, 1, 5 union all
select 6, 2, 7

где m - это будущий fk на таблицу m
n - это будущий fk на таблицу n
id - это identity он не нужен но есть сейчас.

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

declare @result table(m int, n int, id int)
insert into @result(m, n, id)
select 1, 1, 1 union all
select 2, 1, 2 union all
select 4, 2, 4 union all
select 6, 2, 7

В конечно итоге, я хочу сделать на комбинацию полей m и n = первичный ключ.

Помогите голова кипит уже, я пробовал делать объединенное через конкатенацию , а потом брать grouping и having но это настолько медленно работает, что мочи ждать уже нет :-(

Есть ли эффективное решение какое нибудь?
tpg
Дата: 16.01.2009 06:35:17
declare @m2n table(m int, n int, id int)
insert into @m2n(m, n, id)
select 1, 1, 1 union all
select 2, 1, 2 union all
select 1, 1, 3 union all
select 4, 2, 4 union all
select 2, 1, 5 union all
select 6, 2, 7

-- способ №1

delete
	m
from @m2n m
left join
		(
		select
			m
			, n
			, min(id) as id
		from @m2n
		group by m, n
		) a on m.id = a.id
where a.id is null

select * from @m2n


-- способ №2

select
	m
	, n
	, min(id) as id
into #t
from @m2n
group by m, n

delete @m2n		-- реально можно сделать truncate table для постоянных таблиц без DRI
insert
	@m2n
	select
		*
	from #t

select * from @m2n

drop table #t

-- способ №3
......
aleks2
Дата: 16.01.2009 06:56:14
declare @m2n table(m int, n int, id int)
insert into @m2n(m, n, id)
select 1, 1, 1 union all
select 2, 1, 2 union all
select 1, 1, 3 union all
select 4, 2, 4 union all
select 2, 1, 5 union all
select 6, 2, 7

CREATE TABLE #mn (
	[id] [int] NOT NULL ,
	[m] [int] NOT NULL ,
	[n] [int] NOT NULL ,
) 
CREATE  UNIQUE  INDEX [IX_mn] ON #mn([m], [n]) WITH  IGNORE_DUP_KEY  

insert #mn(id, m,n)
select id, m, n FROM @m2n

select * from #mn

drop table #mn
bizonok222
Дата: 16.01.2009 08:38:16
спасибо меня удовлетворил первый способ
tpg
Дата: 16.01.2009 08:40:00
Щаз народ простнетца - ещё накидает!