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

Откуда:
Сообщений: 15
Доброе время суток!
Подскажите как можно в хранимой процедуре выполнить удаление по условию?
Т.е. определяем дату запросом SELECT MAX(date_ev) AS maxd FROM mon_events
и удаляем запросом DELETE FROM mon_events WHERE DATE_EV >= maxd
20 сен 12, 12:05    [13194909]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug,

если maxd - наибольшая дата из существующих в таблице,
то я Вам и без сервера скажу, что DELETE FROM mon_events WHERE DATE_EV >= maxd
отработает мгновенно!
20 сен 12, 12:14    [13194994]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap,

я это и сам написал :) Мне бы как это изобразить в виде хранимой процедуры?
20 сен 12, 12:16    [13195005]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Или надо удалить записи именно за максимальную дату?
WITH CTE(N) AS (SELECT RANK()OVER(ORDER BY date_ev DESC))
DELETE CTE WHERE N=1;
20 сен 12, 12:20    [13195027]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug
iap,

я это и сам написал :) Мне бы как это изобразить в виде хранимой процедуры?
CREATE PROCEDURE в BOL недоступно разве?
20 сен 12, 12:21    [13195035]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug
iap,

я это и сам написал :)
Меня умилил оператор ">="
20 сен 12, 12:23    [13195053]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
iap
radug
iap,

я это и сам написал :) Мне бы как это изобразить в виде хранимой процедуры?
CREATE PROCEDURE в BOL недоступно разве?
http://msdn.microsoft.com/ru-ru/library/ms187926(v=sql.100).aspx
20 сен 12, 12:25    [13195063]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap
radug
iap,

я это и сам написал :) Мне бы как это изобразить в виде хранимой процедуры?
CREATE PROCEDURE в BOL недоступно разве?


Честно говоря в T-SQL я только основы знаю и вот что вы тут написали, я вообще ни в зуб ногой... Что это? :)

Хранимую процедуру создал, там теперь нужно (как я понимаю) селект запросом получить максимальную дату, сохранить результат в @переменную и затем выполнить delete где в условии будет @переменная. Вопрос собственно в том как это написать в хранимой процедуре, или может как-то проще можно?
20 сен 12, 12:28    [13195089]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug
iap
пропущено...
CREATE PROCEDURE в BOL недоступно разве?


Честно говоря в T-SQL я только основы знаю и вот что вы тут написали, я вообще ни в зуб ногой... Что это? :)

Хранимую процедуру создал, там теперь нужно (как я понимаю) селект запросом получить максимальную дату, сохранить результат в @переменную и затем выполнить delete где в условии будет @переменная. Вопрос собственно в том как это написать в хранимой процедуре, или может как-то проще можно?
Зачем обязательно "в @переменную"?
Собственно говоря, и процедура-то - зачем?
Я ж написал Вам без переменных. Можно и ещё десятком способов удалить.
Версию сервера скрываете?
20 сен 12, 12:31    [13195119]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
Glory
Member

Откуда:
Сообщений: 104751
radug
Хранимую процедуру создал, там теперь нужно (как я понимаю) селект запросом получить максимальную дату, сохранить результат в @переменную и затем выполнить delete где в условии будет @переменная. Вопрос собственно в том как это написать в хранимой процедуре, или может как-то проще можно?

Т.е. выбрать из таблицы максмимальную дату(и время ?)
И потом в той же таблице удалить записи, где дата меньше-равно ?
Это такой извращенный способ удаления всех записей ?
20 сен 12, 12:32    [13195131]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Glory
radug
Хранимую процедуру создал, там теперь нужно (как я понимаю) селект запросом получить максимальную дату, сохранить результат в @переменную и затем выполнить delete где в условии будет @переменная. Вопрос собственно в том как это написать в хранимой процедуре, или может как-то проще можно?

Т.е. выбрать из таблицы максмимальную дату(и время ?)
И потом в той же таблице удалить записи, где дата меньше-равно ?
Это такой извращенный способ удаления всех записей ?
У него там больше-равно
20 сен 12, 12:34    [13195155]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap,

сервер 2008 r2
Процедурой решил оформить, т.к. переписываю одну очень старую программу из delphi на C# и хочу часть логики вынести из программы.


WITH CTE(N) AS (SELECT RANK()OVER(ORDER BY date_ev DESC))
DELETE CTE WHERE N=1;
что здесь означает N=1?
20 сен 12, 12:39    [13195209]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug
iap,

сервер 2008 r2
Процедурой решил оформить, т.к. переписываю одну очень старую программу из delphi на C# и хочу часть логики вынести из программы.


WITH CTE(N) AS (SELECT RANK()OVER(ORDER BY date_ev DESC))
DELETE CTE WHERE N=1;
что здесь означает N=1?
Ранг строк в порядке убывания даты равен 1.
Здесь учтено, что "больше или равно максимуму" - это всё равно что "равно максимуму"
20 сен 12, 12:44    [13195245]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap
Glory
пропущено...

Т.е. выбрать из таблицы максмимальную дату(и время ?)
И потом в той же таблице удалить записи, где дата меньше-равно ?
Это такой извращенный способ удаления всех записей ?
У него там больше-равно


Алгоритм немного переделываю, условие со старого стянул, сейчас достаточно одного =, вопрос не в этом :)
20 сен 12, 12:45    [13195249]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Можно ещё и так, конечно (будет работать на всех версиях):
DELETE E
FROM mon_events E
WHERE E.date_ev=(SELECT MAX(EE.date_ev) FROM mon_events EE);
или
DELETE E
FROM mon_events E
WHERE NOT EXISTS(SELECT * FROM mon_events EE WHERE EE.date_ev>E.date_ev);
и ещё десяток вариантов...
20 сен 12, 12:50    [13195292]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap
radug
iap,

сервер 2008 r2
Процедурой решил оформить, т.к. переписываю одну очень старую программу из delphi на C# и хочу часть логики вынести из программы.


WITH CTE(N) AS (SELECT RANK()OVER(ORDER BY date_ev DESC))
DELETE CTE WHERE N=1;
что здесь означает N=1?
Ранг строк в порядке убывания даты равен 1.
Здесь учтено, что "больше или равно максимуму" - это всё равно что "равно максимуму"


а где здесь указано над какой таблицей запрос вытворяем? говорит поле date_ev не найдено.
20 сен 12, 12:53    [13195317]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug
iap
пропущено...
Ранг строк в порядке убывания даты равен 1.
Здесь учтено, что "больше или равно максимуму" - это всё равно что "равно максимуму"


а где здесь указано над какой таблицей запрос вытворяем? говорит поле date_ev не найдено.
Упс!!!
WITH CTE(N) AS (SELECT RANK()OVER(ORDER BY date_ev DESC) FROM mon_events)
DELETE CTE WHERE N=1;
20 сен 12, 12:54    [13195326]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
radug,

вообще, Вам надо ознакомитьс с общими табличными выражениями (CTE) и оконными ранжирующими функциями (OVER()).
Имея в виду, что с синтаксисом DELETE Вы знакомы (но не с CTE в DELETE, да?)
20 сен 12, 12:57    [13195350]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap,

DELETE E
FROM mon_events E
WHERE E.date_ev=(SELECT MAX(EE.date_ev) FROM mon_events EE);


это работает (кто бы сомневался :) )

iap, огромное спасибо Вам, сразу видно профессионал!
20 сен 12, 12:57    [13195353]     Ответить | Цитировать Сообщить модератору
 Re: Удаление по условию  [new]
radug
Member

Откуда:
Сообщений: 15
iap
radug,

вообще, Вам надо ознакомитьс с общими табличными выражениями (CTE) и оконными ранжирующими функциями (OVER()).
Имея в виду, что с синтаксисом DELETE Вы знакомы (но не с CTE в DELETE, да?)


Я в вашем сообщение первый раз увидел этот CTE, сейчас буду разбирать варианты, как они работают, еще раз спасибо!
20 сен 12, 13:01    [13195378]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить