Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Удаление связанных записей  [new]
удаление_связ_записей
Guest
DECLARE  @a TABLE(typ INT, sm int)
DECLARE  @b TABLE(typ1 INT, typ2 INT)

INSERT INTO @b
SELECT 1,4
UNION
SELECT 2,3

INSERT INTO @a
SELECT 1,10
UNION
SELECT 2,0
UNION
SELECT 3,0
UNION
SELECT 4,0


Как наиболее оптимальнее решить вот какую задачу.

Найти все записи в таблице @a по связке typ=typ1, у которых сумма = 0 и удалить все связанные с ним записи typ2.

Т.е. мы находим в @a записи с typ = typ1 - это 1 и 2.

У записи 2 - остаток 0. Смотрим что у него связь с 3.

Следовательно из @a нужно удалить счет 2 и 3.
18 май 16, 18:11    [19190274]     Ответить | Цитировать Сообщить модератору
 Re: Удаление связанных записей  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9163
удаление_связ_записей,

нельзя сказать, что это оптимально, но

DECLARE  @a TABLE(typ INT, sm int)
DECLARE  @b TABLE(typ1 INT, typ2 INT)

INSERT INTO @b values (1,4),(2,3)
INSERT INTO @a values (1,10),(2,0),(3,0),(4,0)

delete @a
	from @a a0
	where exists
	(
		select a1.typ t1, a2.typ t2
		from @b b
		inner join @a a1 on a1.typ = b.typ1
		inner join @a a2 on a2.typ = b.typ2
		where a1.sm = 0 and a2.sm = 0
		and (a0.typ = a1.typ or a0.typ = a2.typ)
	)

select * from @a
18 май 16, 18:32    [19190334]     Ответить | Цитировать Сообщить модератору
 Re: Удаление связанных записей  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Владислав Колосов,

Хотя бы так

DECLARE  @a TABLE(typ INT, sm int)
DECLARE  @b TABLE(typ1 INT, typ2 INT)

INSERT INTO @b values (1,4),(2,3)
INSERT INTO @a values (1,10),(2,0),(3,0),(4,0)

delete @a
from @a a0
CROSS APPLY 
(
	select a1.typ t1, a2.typ t2
	from @b b
	inner join @a a1 on a1.typ = b.typ1
	inner join @a a2 on a2.typ = b.typ2
	where a1.sm = 0 and a2.sm = 0 and (a0.typ = a1.typ or a0.typ = a2.typ)
) X 

select * from @a
18 май 16, 19:14    [19190468]     Ответить | Цитировать Сообщить модератору
 Re: Удаление связанных записей  [new]
удаление_связ_записей
Guest
a_voronin, есть вариант оптимальнее?

Чем CROSS APPLY будет в данном случае быстрее EXISTS ?
19 май 16, 10:59    [19192452]     Ответить | Цитировать Сообщить модератору
 Re: Удаление связанных записей  [new]
удаление_связ_записей
Guest
???
24 май 16, 15:45    [19213195]     Ответить | Цитировать Сообщить модератору
 Re: Удаление связанных записей  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
удаление_связ_записей,

феерическая лень, за 8 дней мог и сам проверить оба варианта...
24 май 16, 15:49    [19213224]     Ответить | Цитировать Сообщить модератору
 Re: Удаление связанных записей  [new]
iljy
Member

Откуда:
Сообщений: 8711
удаление_связ_записей,

как оптимальнее - надо смотреть на реальной базе, но самый простой запрос будет выглядеть примерно так

delete aa
from @a a join @b b on a.typ = b.typ1 join @a aa on aa.typ in (b.typ1, b.typ2)
where a.sm = 0
24 май 16, 15:54    [19213256]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить