powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проверка нескольких VALUES перед INSER INTO
13 сообщений из 13, страница 1 из 1
Проверка нескольких VALUES перед INSER INTO
    #39779975
Hopfen_Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Записываю данные в таблицу раз в минуту так:
Код: sql
1.
2.
3.
4.
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 есть, запись всех данных не произойдет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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())



Подскажите пожалуйста в какую сторону копать?
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39779977
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hopfen_Artur,

Код: sql
1.
2.
3.
4.
INSERT INTO ....
SELECT ...
FROM (VALUES... ) as a 
WHERE ....
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39779983
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hopfen_Artur,

на мердж перепиши
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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]);
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39779989
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут же только вставка. Достаточно NOT EXISTS(SELECT * FROM ... WHERE ...)
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780188
Hopfen_Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не получается что то. Вот так работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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 массива такой строкой:

Код: php
1.
2.
3.
4.
5.
Yii::$app->db->createCommand()->batchInsert(
        'database', 
         ['id', 'oid', 'sum','date'], 
        $oid
)->execute();



весь форум облазил, не нашел, может ссылка у кого нибудь есть на решение проблемы =(
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780200
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hopfen_ArturНе получается что то. Вот так работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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 массива такой строкой:

Код: php
1.
2.
3.
4.
5.
Yii::$app->db->createCommand()->batchInsert(
        'database', 
         ['id', 'oid', 'sum','date'], 
        $oid
)->execute();




весь форум облазил, не нашел, может ссылка у кого нибудь есть на решение проблемы =(Вам же TaPaK написал как надо.
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780205
Hopfen_Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

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



сделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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()))



Не разобрался как это заставить работать, но буду копать в этом направлении, спасибо.
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780207
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hopfen_Artur,
Интуитивное программирование? Документация для слабаков?

как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 )
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780212
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стесняюсь спросить, а зачем newid() в скобках?
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780215
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapСтесняюсь спросить, а зачем newid() в скобках?
ну я скопипастил если что :)
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780223
Hopfen_Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

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

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

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

Сейчас попробую додуматься как исправить.
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780226
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hopfen_ArturTaPaK,

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

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

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

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

(...) as a (nId, oid, sum,date)
...
Рейтинг: 0 / 0
Проверка нескольких VALUES перед INSER INTO
    #39780240
Hopfen_Artur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,

вот так все заработало, огромное спасибо:
Код: sql
1.
2.
3.
4.
5.
6.
7.
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)



для меня это магия какая то, буду изучать документацию =)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проверка нескольких VALUES перед INSER INTO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]