Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как написать КРАСИВО одним DELETEом  [new]
Говорливый Почемукозавр
Guest
В общем у меня есть таблица table1 формируемая в процедуре следующего содержания:

UN_PROCESS	OPISANIE	ERROR_OR_NOT	DATE
52647 Описание шага... 20.06.2012 21:10
52647 Описание шага... 20.06.2012 21:10
52647 Описание шага... 20.06.2012 21:10
52647 Описание шага... ошибка! 20.06.2012 21:11
52647 Описание шага... ошибка! 20.06.2012 21:11
52647 Описание шага... ошибка! 20.06.2012 21:11
52624 Описание шага... 20.06.2012 20:10
52624 Описание шага... 20.06.2012 20:10
52624 Описание шага... 20.06.2012 20:10
52624 Описание шага... ошибка! 20.06.2012 20:11
52624 Описание шага... ошибка! 20.06.2012 20:11
52624 Описание шага... ошибка! 20.06.2012 20:11
52593 Описание шага... 20.06.2012 19:10
52593 Описание шага... 20.06.2012 19:10
52593 Описание шага... 20.06.2012 19:10
52593 Описание шага... ошибка! 20.06.2012 19:11
52593 Описание шага... ошибка! 20.06.2012 19:11
52593 Описание шага... ошибка! 20.06.2012 19:11
52588 Описание шага... 20.06.2012 18:22
52588 Описание шага... 20.06.2012 18:22
52588 Описание шага... 20.06.2012 18:22
52588 Описание шага... 20.06.2012 18:22
52588 Описание шага... 20.06.2012 18:22
52588 Описание шага... 20.06.2012 18:22
52588 Описание шага... ошибка! 20.06.2012 18:23
52588 Описание шага... ошибка! 20.06.2012 18:23
52588 Описание шага... ошибка! 20.06.2012 18:23

Здесь записываются выполнение процессов. Если последний процесс выполнился успешно то мне это ничего не надо - чищу таблицу. Если последний процесс выполнился неудачно то он то мне и нужен. В процедуре есть ещё переменная @only_error которая определяет выбирать в этом последнем неудавшемся процессе только ошибочные значения или все. По умолчанию - 0 что значит выбираем все записи последнего неудавшегося процесса.
В этой таблице у меня должны остаться только те записи для которых верно следующее: UN_PROCESS имеет максимальное значение в таблице, для максимального значения UN_PROCESS есть записи с ERROR_OR_NOT с значением 'ошибка!'. Далее мне нужно в зависимости от значения @only_error оставить все записи данного процесса или удалить

declare @only_error tinyint
set @only_error  = 1
DELETE table1 where UN_PROCESS <> (select max(UN_PROCESS) from table1)
if not exists(select 1 from table1 where ERROR_OR_NOT = 'ошибка!') delete table1 else
if @only_error = 1 delete table1 where ERROR_OR_NOT <> 'ошибка!'


Ну первым DELETом мы убираем все те записи с UN_PROCESS значение которого не максимально. Вот дальше сложнее... Нужно убрать или всех если ERROR_OR_NOT = 'ошибка!' отсутствуют, либо оставить только те которые с ошибками @error_or_not в случае если @only_error = 1.

Есть вариант написать вот это:

DELETE table1 where UN_PROCESS <> (select max(UN_PROCESS) from table1)
if not exists(select 1 from table1 where ERROR_OR_NOT = 'ошибка!') delete table1 else
if @only_error = 1 delete table1 where ERROR_OR_NOT <> 'ошибка!'


Одним красивым Deletом? У меня такое ощущение что тут меня ограничивает незнание какого то логического оператора. Что то надо знать помимо and, or...
21 июн 12, 03:48    [12749918]     Ответить | Цитировать Сообщить модератору
 Re: Как написать КРАСИВО одним DELETEом  [new]
Говорливый Почемукозавр
Guest
if not exists(select 1 from table1 where ERROR_OR_NOT = 'ошибка!') delete table1 else
if @only_error = 1 delete table1 where ERROR_OR_NOT <> 'ошибка!'



И вот это наверняка как то можно запихать в один DELETE без всякого условия с exists... Только не понимаю как...
21 июн 12, 03:52    [12749922]     Ответить | Цитировать Сообщить модератору
 Re: Как написать КРАСИВО одним DELETEом  [new]
Jaffar
Member

Откуда:
Сообщений: 633
delete
from table1
where
		not exists(select 1 from table1 where ERROR_OR_NOT = 'ошибка!')

or		(@only_error = 1 and ERROR_OR_NOT <> 'ошибка!')



студент детектед.
21 июн 12, 06:19    [12749950]     Ответить | Цитировать Сообщить модератору
 Re: Как написать КРАСИВО одним DELETEом  [new]
Говорливый Почемукозавр
Guest
Jaffar
delete
from table1
where
		not exists(select 1 from table1 where ERROR_OR_NOT = 'ошибка!')

or		(@only_error = 1 and ERROR_OR_NOT <> 'ошибка!')



студент детектед.



Ты про себя что ли?

delete from table1 Мугага
22 июн 12, 03:19    [12757099]     Ответить | Цитировать Сообщить модератору
 Re: Как написать КРАСИВО одним DELETEом  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Говорливый Почемукозавр
Jaffar
delete
from table1
where
		not exists(select 1 from table1 where ERROR_OR_NOT = 'ошибка!')

or		(@only_error = 1 and ERROR_OR_NOT <> 'ошибка!')



студент детектед.



Ты про себя что ли?

delete from table1 Мугага


Извиняюсь, ПТУшник детектед.
Пиво и семки ждут тебя.
22 июн 12, 12:43    [12759258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить