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

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

Update на основе данных другой таблицы??? [IB6.x]


Страницы:   1 2

VadimKV ©   (2004-07-12 10:32:00) 

Как выполнить обновление таблицы на основе данных другой таблицы???
Подскажите можно ли в FireBird1.5 выполнить нечто похожее.
Или команду update можно выполнять накладываю условие проверки только на обновляемую таблицу.

update rdb$relation_fields
set rdb$null_flag = null,
   rdb$default_sourse =              
--(select --lf."name_table", lf."field_name",
   case lf."field_type"              --Это главный момент
   when    'alpha'     then    ''
   when    'number'    then    1
   when    'date'      then    '1.01.2004'
   else 'xxx'
   end
   from "list_fld" lf, rdb$relation_fields sys  --Ругается FB1.5 на этот from
where   (
           "field_lookup" is not null
           or "field_key" = '*'
           or "field_name" in
           (
           select "field_lookup" from "list_fld"
           where "field_lookup" is not null
           )
       )
       and
       (sys.rdb$relation_name = lf."name_table"
       and sys.rdb$field_name = lf."field_name")
--)


Курдль   (2004-07-12 17:36:00) [1]

На сайбэйсе и на Оракле не сработало.


stud   (2004-07-12 17:27:00) [2]

сработает , главное предусмотреть возвращение одной записи


Johnmen   (2004-07-12 17:26:00) [3]

>Курдль ©   (12.07.04 17:23) [22]

Сработает. А что там "кривого" ?


Курдль   (2004-07-12 17:23:00) [4]


> VadimKV   (12.07.04 17:19) [20]
> Я только работал в MSSQL2000 и FB1.5 вот изучаю.
> Насчет "умный прогромист" не имел ни чего плохого и ни кого
> ни хотел обидить, я сам то об SQL узнал примерно 3 месяца
> назад.

Здесь никто ни на кого не обижается. Кто-то приходит с вопросом, кто-то тренируеи мозги.

Но я все-таки сгораю от любопытства:
1. Сработает ли запрос [18]?  (Кто-нибудь соизволит проверить)?
2. Зачем понадобилось так извращаться вообще [0]?  (Другие варианты типа ХП, клиента, отброшены по какой-то причине?)


Johnmen   (2004-07-12 17:20:00) [5]

>VadimKV

Так у тебя в  (12.07.04 16:19) [11] одна и та же таблица...:)

А насчет скорости, так читай по ссылке, которую сам и привел...


VadimKV   (2004-07-12 17:19:00) [6]

Я только работал в MSSQL2000 и FB1.5 вот изучаю.
Насчет "умный прогромист" не имел ни чего плохого и ни кого ни хотел обидить, я сам то об SQL узнал примерно 3 месяца назад.


Курдль   (2004-07-12 17:17:00) [7]

Кстати, Вы знаете, как пишется условие "один-к-одному"?

where T1.T2_ID = T2.T2_ID
 and T2.T1_ID = T1.T1_ID


Соловьев   (2004-07-12 17:16:00) [8]

update <Таб1>
set <Таб1>.<п2> = (select first 1<Таб2>.<п3>
           from <Таб2>
           where <Таб2>.<п1>=<Таб1>.<п1>)


Курдль   (2004-07-12 17:14:00) [9]

Ну так Вы пробовали его реально выполнить на IB?
Мне аж интересно стало!
Обычно СУБД не сильно тибидохается вопросом, умный там программист, или нет - просто выдает ошибку и все!
Такой запрос не пройдет ни на Оракле ни на Сайбэйсе (а значит и на MS SQL).


VadimKV   (2004-07-12 17:11:00) [10]

Курдль
Связь таблиц происходит на уровне один к одному, поэтому если грамотно разрабатываешь, то Select не вернёт только одно значение вместо множества.


Курдль   (2004-07-12 17:05:00) [11]


> set <Таб1>.<п2> = (select <Таб2>.<п3>
>             from <Таб2>
>             where <Таб2>.<п1>=<Таб1>.<п1>)

Нормальная СУБД не должна разрешить такое выражение на уровне проверки синтаксиса т.к. селект может возвратить несколько значений.


VadimKV   (2004-07-12 17:01:00) [12]

stud
В запросе эта строчка закоментирована
<--(select --lf."name_table", lf."field_name">, "--" - моя ошибка надо было её вобще не выводить.

Johnmen
update <Таб1>
set <Таб1>.<п2> = (select <Таб2>.<п3>
            from <Таб2>
            where <Таб2>.<п1>=<Таб1>.<п1>)

Вот такой запрос будет работать, но очень медленно, т.к. вместо того чтобы Изменить выборочные записи, он все равно будет проходить все записи таблицы. Потомочто условие связывания нельзя добавить в Where предложения Update.


Johnmen   (2004-07-12 16:28:00) [13]

>update TABLE1
>set FIELD1 = (select PRIMARYKEY
>             from TABLE1 T1
>             where T1.FIELD1=FIELD2)

То же самое...

update TABLE1
set FIELD1 = case when FIELD1=FIELD2 then PRIMARYKEY else NULL end


stud   (2004-07-12 16:23:00) [14]

так ты сам можеш проччитать что он написал и ты??

> --(select --lf."name_table", lf."field_name",
> >    case lf."field_type"              --Это главный момент
> >    when    'alpha'     then    ''
> >    when    'number'    then    1
> >    when    'date'      then    '1.01.2004'
> >    else 'xxx'
> >    end

у тебя селект возвращает ТРИ поля lf."name_table", lf."field_name",и еще кейс одно. как же оно работать будет???? еще раз внимательно прочитай что тебе написали.
> Johnmen ©   (12.07.04 15:51) [10]
то же самое.


VadimKV   (2004-07-12 16:19:00) [15]

Вот предлагую всем почитать http://www.ibase.ru/devinfo/updsame.htm один человек подсказал с друго сайта.
Есть такое решение проблемы, но сразу видно насколь медленное.
update TABLE1
set FIELD1 = (select PRIMARYKEY
             from TABLE1 T1
             where T1.FIELD1=FIELD2)

И все таки. Можно сделать через View и триггер, но уменя ни как не заработает. А в книге для этого случая пример триггера не расписан.


Johnmen   (2004-07-12 15:51:00) [16]

Неужели такая конструкция не работает ? "Не верю!" (с)
Update <Таб1>
set <Таб1>.<поле 2>='xxx', ...
where <Таб1>.<поле 3>=
 (select <single value> from <Таб2>
  where <Таб1>.<поле 1> = <Таб2>.<поле 1>)


stud   (2004-07-12 15:46:00) [17]


> rdb$default_sourse =              
> --(select --lf."name_table", lf."field_name",
>    case lf."field_type"              --Это главный момент
>    when    'alpha'     then    ''
>    when    'number'    then    1
>    when    'date'      then    '1.01.2004'
>    else 'xxx'
>    end

у тебя возвращает 3 значения, а надо одно. или я не прав?


VadimKV   (2004-07-12 15:39:00) [18]

Если знаете как помочь, то просто помогите, если не знаете ни надо ничего отвечать. Для чего это надо сделать уже другой вопрос.
Это действительно очень нужно.


stud   (2004-07-12 15:34:00) [19]

по вопросу очень похоже на попытку репликации, по приведенным примерам - модификация структуры.
но больше наверное репликация, http://www.ibase.ru/develop.htm


Курдль   (2004-07-12 15:30:00) [20]

Д Л Я    Ч Е Г О    В Ы   В С Ё   Э Т О   Х О Т И Т Е  С Д Е Л А Т Ь??????


Страницы:   1 2

Наверх

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