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

Откуда:
Сообщений: 106
Добрый день. Записываю данные в таблицу раз в минуту так:
INSERT INTO database ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), '0ADA876A-4C54', 0 , GETDATE()), 
((newid()), 'B8BBC8B6-F36F-434F', 0 , GETDATE()),
((newid()), 'E0472205-8C90-4C66', 0 , GETDATE())

Необходимо проверить каждый OID перед тем как записать, если конкретный OID по условию date > DATEADD(minute, -1, GETDATE()) не найден, то конкретно его и записать.
Пробовал так, но если хотя бы один OID есть, запись всех данных не произойдет:
IF NOT EXISTS ( SELECT * FROM database 
    WHERE oid = '0ADA876A-4C54'
    AND date > DATEADD(minute, -1, GETDATE()) 
    OR oid = 'B8BBC8B6-F36F'
    AND date > DATEADD(minute, -1, GETDATE())
    OR oid = 'E0472205-8C90'
    AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), '0ADA876A-4C54', 0 , GETDATE()), 
((newid()), 'B8BBC8B6-F36F-434F', 0 , GETDATE()),
((newid()), 'E0472205-8C90-4C66', 0 , GETDATE())


Подскажите пожалуйста в какую сторону копать?
27 фев 19, 16:44    [21820864]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Hopfen_Artur,

INSERT INTO ....
SELECT ...
FROM (VALUES... ) as a 
WHERE ....
27 фев 19, 16:46    [21820869]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
court
Member

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

на мердж перепиши
merge [database] as dest
using (select [id] ,[oid] ,[sum],[date] from (
	VALUES ((newid()), '0ADA876A-4C54', 0 , GETDATE()), 
	((newid()), 'B8BBC8B6-F36F-434F', 0 , GETDATE()),
	((newid()), 'E0472205-8C90-4C66', 0 , GETDATE())) as T) as src
on dest.[oid]=src.[oid] and dest.[date] > DATEADD(minute, -1, GETDATE()) 

when not matched then
	insert ([id] ,[oid] ,[sum],[date] ) 
	values (src.[id], src.[oid], src.[sum], src.[date]);
27 фев 19, 16:53    [21820878]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Тут же только вставка. Достаточно NOT EXISTS(SELECT * FROM ... WHERE ...)
27 фев 19, 17:02    [21820887]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
Hopfen_Artur
Member

Откуда:
Сообщений: 106
Не получается что то. Вот так работает:
IF NOT EXISTS ( SELECT * FROM database 
                   WHERE oid = '0ADA876A-4C54'
		   AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), '0ADA876A-4C54', 0 , GETDATE())

IF NOT EXISTS ( SELECT * FROM database  
                   WHERE oid = 'B8BBC8B6-F36F'
		AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), 'B8BBC8B6-F36F', 0 , GETDATE())

IF NOT EXISTS ( SELECT * FROM database 
                   WHERE oid = 'E0472205-8C90'
		 AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), 'E0472205-8C90', 0 , GETDATE())


Но это не то. Изначально не известно сколько oid будет записано, происходит insert массива такой строкой:

Yii::$app->db->createCommand()->batchInsert(
        'database', 
         ['id', 'oid', 'sum','date'], 
        $oid
)->execute();


весь форум облазил, не нашел, может ссылка у кого нибудь есть на решение проблемы =(
28 фев 19, 09:13    [21821374]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Hopfen_Artur
Не получается что то. Вот так работает:
IF NOT EXISTS ( SELECT * FROM database 
                   WHERE oid = '0ADA876A-4C54'
		   AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), '0ADA876A-4C54', 0 , GETDATE())

IF NOT EXISTS ( SELECT * FROM database  
                   WHERE oid = 'B8BBC8B6-F36F'
		AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), 'B8BBC8B6-F36F', 0 , GETDATE())

IF NOT EXISTS ( SELECT * FROM database 
                   WHERE oid = 'E0472205-8C90'
		 AND date > DATEADD(minute, -1, GETDATE()))

INSERT INTO database  ([id] ,[oid] ,[sum],[date] )  
VALUES ((newid()), 'E0472205-8C90', 0 , GETDATE())



Но это не то. Изначально не известно сколько oid будет записано, происходит insert массива такой строкой:

Yii::$app->db->createCommand()->batchInsert(
        'database', 
         ['id', 'oid', 'sum','date'], 
        $oid
)->execute();



весь форум облазил, не нашел, может ссылка у кого нибудь есть на решение проблемы =(
Вам же TaPaK написал как надо.
28 фев 19, 09:54    [21821406]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
Hopfen_Artur
Member

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

так белеберда какая то получилась =(
по этому шаблону
INSERT INTO ....
SELECT ...
FROM (VALUES... ) as a 
WHERE ....


сделал так:
INSERT INTO database
SELECT *
FROM (VALUES((newid()), '0ADA876A-4C54', 0 , GETDATE()), 
((newid()), 'B8BBC8B6-F36F', 0 , GETDATE()),
((newid()), 'E0472205-8C90', 0 , GETDATE())) as a 
WHERE a.oid = '0ADA876A-4C54'
AND a.date > DATEADD(minute, -1, GETDATE()) 
OR a.oid = 'B8BBC8B6-F36F'
AND a.date > DATEADD(minute, -1, GETDATE())
OR a.oid = 'E0472205'
AND a.date > DATEADD(minute, -1, GETDATE()))


Не разобрался как это заставить работать, но буду копать в этом направлении, спасибо.
28 фев 19, 10:07    [21821418]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Hopfen_Artur,
Интуитивное программирование? Документация для слабаков?

как-то так
INSERT INTO database
SELECT *
FROM (VALUES((newid()), '0ADA876A-4C54', 0 , GETDATE()), 
((newid()), 'B8BBC8B6-F36F', 0 , GETDATE()),
((newid()), 'E0472205-8C90', 0 , GETDATE())) as a 
WHERE 
	a.date > DATEADD(minute, -1, GETDATE()) 
AND	NOT EXISTS (SELECT 1 FROM database b WHERE a.oid = b.OId )
28 фев 19, 10:10    [21821422]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Стесняюсь спросить, а зачем newid() в скобках?
28 фев 19, 10:16    [21821430]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iap
Стесняюсь спросить, а зачем newid() в скобках?

ну я скопипастил если что :)
28 фев 19, 10:19    [21821434]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
Hopfen_Artur
Member

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

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

Пока с таким запросом, ошибка:

Для столбца 1 таблицы "a" не указано имя.

Сейчас попробую додуматься как исправить.
28 фев 19, 10:40    [21821454]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Hopfen_Artur
TaPaK,

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

Пока с таким запросом, ошибка:

Для столбца 1 таблицы "a" не указано имя.

Сейчас попробую додуматься как исправить.


(...) as a (nId, oid, sum,date)
28 фев 19, 10:44    [21821461]     Ответить | Цитировать Сообщить модератору
 Re: Проверка нескольких VALUES перед INSER INTO  [new]
Hopfen_Artur
Member

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

вот так все заработало, огромное спасибо:
INSERT INTO database
SELECT *
FROM (VALUES(newid(), '0ADA876A-4C54', 0 , GETDATE()), 
(newid(), 'B8BBC8B6-F36F-434F', 0 , GETDATE()),
(newid(), 'E0472205-8C905', 0 , GETDATE())) as a ([id], [oid], [sum], [date])
WHERE
NOT EXISTS (SELECT 1 FROM database  b WHERE b.date > DATEADD(minute, -1, GETDATE()) AND a.oid = b.oid)


для меня это магия какая то, буду изучать документацию =)
28 фев 19, 10:58    [21821481]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить