![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос sql: если есть изменить запись если нет то добавить запись [D7, MSSQL]
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