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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2009, 15:57   #1
l0nley
Новичок
Джуниор
 
Регистрация: 02.07.2009
Сообщений: 2
По умолчанию Запрос UPDATE&INSERT&DELETE

Исходная:
есть таблица price_supplier:
Код:
orphan char(50) not null,
partnum char(50) not null,
descr char(100) default 'Нет описания',
amount_s char(5) not null default '0',
skv_code char(5) not null default 'EUR',
price float not null
есть вторая таблица td_avail:
Код:
orphan char(50) not null,
partnum char(50) not null,
description char(100) not null default 'Нет описания',
amount_s char(5) not null default '0',
currency char(5) not null default 'EUR',
price float not null,
supplier char(50) not null default 'My company'
Описание таблиц:

price_supplier - Таблица наличия товара у данного поставщика. Для каждого из поставщиков
существует отдельная таблица с именем price_<поставщик>.

td_avail - таблица наличия товаров у всех поставщиков.

Товары идентифицируются парой (orphan,partnum)

Задача:

Известно сразу - поставщик supplier='какойто поставщик'

Если товар (orphan,partnum,supplier) есть в таблице price_supplier и в таблице td_avail -> обновить
данные о товаре из таблицы price_supplier в таблице td_avail для данного поставщика
Если товар (orphan,partnum,supplier) есть в таблице price_supplier но нету в td_avail - > добавить
товар (orphan,partnum,supplier,descriptio n...) в таблицу td_avail
Если товар (orphan,partnum,supplier) есть в таблице td_aval, но нету в таблице price_supplier ->
удалить товар (orpha,partnum,supplier) из таблицы td_avail


Интересует не решение "в лоб", а как это сделать в один запрос?
рыл в сторону MERGE ничего не нарыл по последнему пункту.

в ответах желательно диалект TSQL для MSSQL 2000
l0nley вне форума Ответить с цитированием
Старый 02.07.2009, 19:13   #2
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Цитата:
Сообщение от l0nley Посмотреть сообщение
Для каждого из поставщиков
существует отдельная таблица с именем price_<поставщик>.
Хмм... А если, скажем, у меня 10000 поставщиков, то что - прикажете создать 10000 таблиц в БД?

Цитата:
Сообщение от l0nley Посмотреть сообщение
Интересует не решение "в лоб", а как это сделать в один запрос?
рыл в сторону MERGE ничего не нарыл по последнему пункту.
ИМХО, здесь лучше начинать не с написания запросов, а с перепроектирования БД. В противном случае при сравнении полей двух таблиц (особенно, если поля еще и строковые), да и если при этом еще учесть, что вам нужно сравнивать, по-видимому, кучу таблиц, то в данном случае запросто можно схлопотать серьезное снижение производительности. А оно вам надо?
edgy вне форума Ответить с цитированием
Старый 02.07.2009, 22:05   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

именно что мердж и будет нужен только для 1го и 2го пунктов
а удалить уж вторым запросом

З.Ы.: а так конечно странно, раз уж структура данных одинакова для всех поставщиков, то с какой целью заводили столько таблиц?! достаточно всего 3х таблиц - td_availб price_supplier (с добавлением ссылки на самого поставщика), собсна сама таблица с поставщиками
soleil@mmc вне форума Ответить с цитированием
Старый 03.07.2009, 14:42   #4
l0nley
Новичок
Джуниор
 
Регистрация: 02.07.2009
Сообщений: 2
По умолчанию

Цитата:
ИМХО, здесь лучше начинать не с написания запросов, а с перепроектирования БД.
Молодой человек, вы когданибудь "перепроектировали" БД работающей вот уже 6 лет базы данных, к которой написано около десятка бизнес приложений?)
Я бы с превеликим удовольствием изменил структуру "под себя", но анализировать тысячи строк чужого кода у меня нет ни желания, ни возможности.
soleil@mmc спасибо, я всетаки думал мердж может побольше немножко
Ну не судьба значит "за один раз"
l0nley вне форума Ответить с цитированием
Старый 17.07.2009, 05:37   #5
Valeno
 
Аватар для Valeno
 
Регистрация: 13.07.2009
Сообщений: 4
По умолчанию Запрос UPDATENSERTELETE

Существует форма для поиска по бд. В форме 4 параметра. Как написать запрос, чтобы в том случае если выбран один параметр, а другие 3 не тронуты, поиск все равно велся.
Я написала так: Код SQL:
Valeno вне форума Ответить с цитированием
Старый 17.07.2009, 05:59   #6
A_r_r_a_y
Форумчанин
 
Аватар для A_r_r_a_y
 
Регистрация: 01.03.2008
Сообщений: 165
По умолчанию

Если правильно Вас понял, то примерно вот так (тут только для 3-х полей, но думаю разберетесь):
Код:
var
  LocValues : Variant;
  LocFields : String;
  LocOpts : TLocateOptions;
  i : Integer;
begin
  LocValues:=VarArrayCreate([0,4],varVariant);
  i:=0;
  if (Length(LE1.Text)>0) then
    begin
      LocValues[i]:=LE1.Text;
      Inc(i);
    end;
  if (Length(LE2.Text)>0) then
    begin
      LocValues[i]:=LE2.Text;
      Inc(i);
    end;
  if (Length(LE3.Text)>0) then
    begin
      LocValues[i]:=LE3.Text;
      Inc(i);
    end;
  LocOpts:=[loCaseInsensitive];
  if RG1.ItemIndex=0 then
    LocOpts:=LocOpts+[loPartialKey];
  if (Length(LE1.Text)>0) then
    LocFields:='K_FIO';
  if (Length(LE2.Text)>0) then
    if (LocFields='') then
       LocFields:='R_FIO'
     else
       LocFields:=LocFields+';'+'R_FIO';
  if (Length(LE3.Text)>0) then
    if (LocFields='') then
      LocFields:='D_KOMMENT'
    else
      LocFields:=LocFields+';'+'D_KOMMENT';
  i:=0;
  DM.IBPriem.First;
  if (DM.IBPriem.Locate(LocFields,LocValues,LocOpts)<>false) then
    begin
      //что-то делаем с найденным      
    end;
end;
LE1,LE2,LE3 - LabelEdit
RG1 - RadioGroup(по точному совпадению искать или по частичному)
A_r_r_a_y вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просто не понимаю б чём проблема!!!!!!!(char* && index) artush1984 Общие вопросы C/C++ 12 30.05.2009 03:30
insert и update Tanusha SQL, базы данных 4 13.03.2009 14:47
Проблема с MVC++ 2005 && 2008 на висте NetGod Софт 1 09.08.2008 17:14
Delphi & Access & Ole vodila БД в Delphi 0 15.07.2008 11:11
помгите! string Copy & Delete Димарик Общие вопросы Delphi 4 05.11.2007 14:11