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

Откуда:
Сообщений: 203
Доброго времени суток. Помогите пожалуйста к одом треггера, задача такова:

В таблицу вставляется две записи, у которой tele_time одинаковый, а поле speed у одной записи нулевое, у другой может быть любое занчение.
Необходимо триггером удалять запись с нулевым speed, оставлять только ту запись, в которой есть значение. Но, так же необходимо оставлять эти записи, если их tele_time равен и speed = 0.
Подумав, я понял что самостоятельно я такой треггер не напишу, поэтому прошу помощи специалистов. Заранее спасибо!

Записи в таблице выглядят вот таким образом - http://s46.radikal.ru/i111/1604/bd/c4e660f28ddf.png
21 апр 16, 08:09    [19086030]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с тригером.  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
На Вашей картинке tele_time явно не одинаковый. Формулировка задачи неоднозначная.

Ondayl
удалять запись с нулевым speed, оставлять только ту запись, в которой есть значение

Ondayl
необходимо оставлять эти записи, если их tele_time равен и speed = 0


Относительно триггера, Вам достаточно написать правильно условие:
CREATE TRIGGER dbo.trg_I_tbl
	ON dbo.tbl
	INSTEAD OF INSERT
AS 
BEGIN

    SET NOCOUNT ON;

    INSERT INTO tbl
    SELECT *
    FROM INSERTED
    ...

END


Ondayl
я понял что самостоятельно я такой треггер не напишу

А Вы попробуйте. Если ничего не пробовать, то ничего и не получится.
21 апр 16, 08:34    [19086098]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с тригером.  [new]
iljy
Member

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

проще записи не удалять, а вставлять только то, что нужно. так что триггер, как вам уже написали, INSTEAD OF INSERT. А дальше пишете фильтр, для каждой группы по tele_time получаете min(speed) и max(speed) (помогут оконные функции OVER(PARTITION BY ..), после чего условие выборки из inserted будет примерно такое
 (mi = ma and mi = 0) or speed != 0
21 апр 16, 08:44    [19086123]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с тригером.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
AlanDenton, благодарю за наводку! Попробую.

автор
На Вашей картинке tele_time явно не одинаковый. Формулировка задачи неоднозначная.

Просто получилось так, пример действительно не самый удачный. Прощу прощения.

http://s019.radikal.ru/i617/1604/ca/9b8db45217de.png - вот в этом случае нужно удалять то что с 0,

http://s008.radikal.ru/i304/1604/82/264aea239f07.png - а вот в этом не нужно. Я вот что имел ввиду.

автор
для каждой группы по tele_time получаете min(speed) и max(speed)


Тут что-то вообще не очень понял...
21 апр 16, 10:31    [19086675]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с тригером.  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
IF OBJECT_ID(N'dbo.ioi_tbl','TR') IS NULL
EXEC(N'CREATE TRIGGER dbo.ioi_tbl ON dbo.tbl INSTEAD OF INSERT AS;');
GO
ALTER TRIGGER dbo.ioi_tbl ON dbo.tbl INSTEAD OF INSERT AS
SET NOCOUNT ON;
WITH CTE AS (SELECT tele_time,speed,zero=SUM(CASE speed WHEN 0 THEN 1 ELSE 0 END)OVER(PARTITION BY tele_time) FROM inserted)
INSERT dbo.tbl(tele_time,speed)
SELECT tele_time,speed
FROM CTE
WHERE speed<>0 OR zero>1;
GO
???

Но встаёт вопрос: надо ли проверять, не лежат ли уже в таблице записи с speed=0 и с тем же tele_time, которые вставляются?
Потому что если нулевой speed для конкретного tele_time один, то тего вроде как вставлять не нужно.
Но если для такого tele_time нулевая запись в таблице уже есть, то вроде как вставлять надо, ибо их там станет больше, чем одна?
21 апр 16, 11:24    [19087033]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с тригером.  [new]
iljy
Member

Откуда:
Сообщений: 8711
Ondayl

автор
для каждой группы по tele_time получаете min(speed) и max(speed)


Тут что-то вообще не очень понял...



Читайте в BOL про min(..) over(partition by ...).
21 апр 16, 11:50    [19087234]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи с тригером.  [new]
Ondayl
Member

Откуда:
Сообщений: 203
Но встаёт вопрос: надо ли проверять, не лежат ли уже в таблице записи с speed=0 и с тем же tele_time, которые вставляются?
Потому что если нулевой speed для конкретного tele_time один, то тего вроде как вставлять не нужно.
Но если для такого tele_time нулевая запись в таблице уже есть, то вроде как вставлять надо, ибо их там станет больше, чем одна?


Ну вообще надо, это было бы просто замечательно. tele_time с нулевым значением пусть будет больше, чем одна, по идее это на бизнес-логику не должно повлиять. Применив триггер, при вставке в таблицу стало ругаться, что device_code NULL, а там такого нельзя, и ставка фейлится.
21 апр 16, 18:53    [19090233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить