Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

запрос sql: если есть изменить запись если нет то добавить запись [D7, MSSQL]


Страницы:   1 2

redlord ©   (2005-07-17 21:26:00) 

всем привет
народ помогите составить запрос sql к базе mssql
имеется таблица с тремя полями f1 f2 f3 записи в f1 уникальны
мне нужно добавлять строку тока в том случае если значение из добавляемой строки в поле f1 не совпадает ни с одним значение поля F1 уже имеющихся в таблице.а если совпадают то поменять у уже имеюжейся записи значение поля f2


Anatoly Podgoretsky   (2005-07-18 09:56:00) [21]

Fay ©   (18.07.05 09:38) [5]
Ни чем, вопрос про MS SQL


Fay   (2005-07-18 09:53:00) [22]

2 Ega23 ©   (18.07.05 9:52) [11]
index seek


Ega23   (2005-07-18 09:52:00) [23]

2 Fay ©   (18.07.05 09:49) [10]

Ну формально-то он прав.
В первый раз ищет exists (в моём случае F1=@F1).
Во второй - ищет по where.
Если взять крайни случай, что интересующая нас запись самая последнеяя - получается действительно 2 скана.
Но: если это поле индексировано, то по какому алгоритму будет искаться F1=@F1?


Fay   (2005-07-18 09:49:00) [24]

2 evvcom ©   (18.07.05 9:46) [9]
Внимательно жду(ждём) подробностей.


evvcom   (2005-07-18 09:46:00) [25]


> MOA ©   (18.07.05 09:36) [4]
> Ega23 ©   (18.07.05 09:38) [6]

Ваши запросы в случае update делают 2 скана таблицы. Зачем, если можно обойтись одним?


MOA   (2005-07-18 09:45:00) [26]

2Fay ©
Согласен, на этот аспект внимания не обратил :(.


Fay   (2005-07-18 09:40:00) [27]

2 MOA ©   (18.07.05 9:36) [4]
Удача явно потребуется, т.к. между
IF EXISTS(SELECT * FROM t WHERE f1=..)
и
UPDATE ....
ELSE
INSERT ....

запись может быть удалена/добавлена.


Ega23   (2005-07-18 09:38:00) [28]


Declare @X int
Set @X=-1
Select @X=1 from Table1 where F1=...
if @X=-1
begin
 Insert
end
else
begin
 Update
end


Fay   (2005-07-18 09:38:00) [29]

2 Anatoly Podgoretsky ©   (18.07.05 9:33) [3]
А в Oracle есть BEFORE. И чего, как это поможет?


MOA   (2005-07-18 09:36:00) [30]

Поскольку поле f1 - первичный ключ => индексировано, прозрачнее будет (я бы так и сделал)
IF EXISTS(SELECT * FROM t WHERE f1=..)
UPDATE ....
ELSE
INSERT ....
Удачи!


Anatoly Podgoretsky   (2005-07-18 09:33:00) [31]

В MSSQL есть триггер INSTEAD OF


evvcom   (2005-07-18 09:24:00) [32]

Раньше в MSSQL exception не было, сейчас на скору руку тоже не нашел, так что мой вариант таков:
update ...
if @@ROWCOUNT = 0
 insert ...


Desdechado   (2005-07-17 22:56:00) [33]

begin
 insert...
exception
 update
end;

можно оформить как кодовый блок в SQL.Text
при условии, что в структуре БД правильно прописаны CONSTRAINTS


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо