Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2014, 23:21   #1
Aleks_006
Пользователь
 
Регистрация: 19.03.2013
Сообщений: 23
По умолчанию Условие в SQL

Возможно как-то сделать так, чтобы при вбивании записи добавлялась новая строка, если такого значения поля ещё не встречалось (запустить SELECT); а если уже встречалось, то поменять у товара количество, например, заменить 1 на 2 (UPDATE)?
Aleks_006 вне форума Ответить с цитированием
Старый 23.10.2014, 07:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да. можно. Решение зависит от СУБД.
Пример для MS SQL:
Код:
-- Description:	Применяет в сборку деталь узел из другой модели
-- =============================================
CREATE PROCEDURE [dbo].[ПрименитьИз]
 @IDPartWhat int,
 @IDModelTo int, @IDAsmTo int
AS
BEGIN
 --- Посмотрим сколько штук в сборке уже применено --------------
 Declare @id int
if @IDAsmTo is null
	 declare cur cursor for
	  select top 1 id
	   from KS
		where (IDModel=@IDModelTo)
		 and  (IDAsm is null)
		 and IDPart=@IDPartWhat
	   group by id
		having COUNT(idpart)>0
 else
	 declare cur cursor for
	  select top 1 id
	   from KS
		where (IDModel=@IDModelTo)
		 and  (IDAsm =@IDAsmTo)
		 and IDPart=@IDPartWhat
	   group by id
		having COUNT(idpart)>0

 open cur
 Fetch next from cur into @id
 close cur
 deallocate cur
 ----- если нет такого то внести ---------
 if (@id is null)
	 INSERT INTO [KS]
			   ([IDModel]
			   ,[IDAsm]
			   ,[IDPart]
			   ,[Штуки])
		 VALUES
			   (@IDModelTo
			   ,@IDAsmTo
			   ,@IDPartWhat
			   ,1)
 else
 ------- Иначе увеличить количество ----------
     update KS set Штуки=Штуки+1 where ID=@id

END
GO
Функция определяет есть ли в... наборе определенном такая запись, если есть - увеличивает ее поле "Штуки", иначе запись создается.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2014, 08:38   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
declare cur cursor
Зачем кувалдой по сапожному гвоздю? SELECT-ом то злополучное @id получить проще и быстрей
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.10.2014, 09:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Э-э-э дарагой, слющьй, у мэня савсэм другой задача бил, да
Короче говоря это просто обрезки остались. Там по курсору еще несколько разных проходов по технологии были, а просто в окончательной версии их реализовывал, а в своих архивах не стал сохранять, ибо надобности нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.10.2014, 09:56   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

MS SQL 2008 или старше не поддерживает merge? Будет одним оператором.
Vapaamies вне форума Ответить с цитированием
Старый 23.10.2014, 10:44   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,157
По умолчанию

не знаю как там у мелкомягких, а в MySQL - http://dev.mysql.com/doc/refman/5.6/...duplicate.html делается такая вещь на ура одним запросом
ADSoft вне форума Ответить с цитированием
Старый 23.10.2014, 10:50   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В FireBird тоже INSERT OR UPDATE есть, да и MERGE не только в последних версиях MS SQL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.10.2014 в 10:54.
Аватар вне форума Ответить с цитированием
Старый 24.10.2014, 14:31   #8
Aleks_006
Пользователь
 
Регистрация: 19.03.2013
Сообщений: 23
По умолчанию

У меня Interbase. Как этот самый INSERT OR UPDATE реализовать? Или, может, проще использовать if... then...else? Но тоже синтаксис не знаю.
Aleks_006 вне форума Ответить с цитированием
Старый 24.10.2014, 14:43   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Есть такой пример: http://www.firebirdsql.su/doku.php?id=update_or_insert
Правда для огнептицы, но под интербейс должен подойти.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.10.2014, 14:44   #10
Aleks_006
Пользователь
 
Регистрация: 19.03.2013
Сообщений: 23
По умолчанию

Если подробнее, мне бы нужен триггер, который удаляет запись из одной таблицы при добавлении в другую записи с таким же id. Пока наработки такие:

Код:
CREATE TRIGGER del_tov FOR prodazha ACTIVE AFTER INSERT AS BEGIN
IF (tovar.kolichestvo>1) THEN
UPDATE tovar SET tovar.kolichestvo=tovar.kolichestvo-1 WHERE tovar.id_knigi=prodazha.id_knigi
ELSE
DELETE FROM tovar WHERE tovar.id_knigi=prodazha.id_knigi;
END
Сейчас ругается на else. Что там не так?
Aleks_006 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Условие выбора в sql-запросе на vba ilnarinho Microsoft Office Excel 2 11.09.2012 23:52
Удаление строки с помощью SQL запроса (Query1.SQL.ADD('Delete....')) Schutze Помощь студентам 6 29.11.2009 22:15
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26