Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Вниз

Update на основе данных другой таблицы???   Найти похожие ветки 

 
VadimKV   (2004-07-12 10:32) [0]

Как выполнить обновление таблицы на основе данных другой таблицы???
Подскажите можно ли в 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 10:36) [1]

LocalSQL.hlp+UPDATE statement


 
Курдль ©   (2004-07-12 10:39) [2]


> Как выполнить обновление таблицы на основе данных другой
> таблицы???


А что надо сделать-то?


 
VadimKV   (2004-07-12 14:59) [3]

Может кто нибудь знает как решить эту проблему через View.
Через View, я попытался, т.е. использовать update <Имя View> set <...>. Но View становится не модифицируемым при использовании таких средств как:
- подзапросы;
- агрегатных ф-ии;
- UDF;
- предложения Distinct, having и д.р.
В книге все эти ограничения предлагают обойти через триггер. У меня не получилось.

Не знаю как можно написать, что серъёзное не обновляя данные таблицы на основе данных других таблиц. Не уже ли ни укого такой проблемы не было, товарищи Мастера?
Если кто знает как решить эту проблему просто подскажите.
Текст свих запросов не даю потомучто наверняка сложно будет сразу разобраться. Если кто попросит то покажу.
На сайте SQL.ru пока тоже тишина по этому вопросу.


 
Курдль ©   (2004-07-12 15:02) [4]


> Если кто знает как решить эту проблему просто подскажите.

КАКУЮ ПРОБЛЕМУ???
"Если Вы идете ко врачу - не озвучивайте свои предположения! Просто опишите симптомы!" (с)

Что Вы хотите автоматизировать, если не секрет?


 
VadimKV   (2004-07-12 15:22) [5]

Стандартная конструкция:
Update <Таблица> set <поле1>="xxx"
where <условие>
<Условие> - накладывается только на Изменяюмую таблицу.

Я хочу:
Update <Таб1>
set <Таб1>.<поле 2>="xxx",
////////
   <Таб1>.<поле 3>=<Таб2>.<поле 5>
или
   <Таб1>.<поле 3>=case <Таб2>.<поле 5>
                        when "1" then "a"
                        when "2" then "b"
                        end
////////
where <Таб1>.<поле 1> = <Таб2>.<поле 1>

Такая вещь не прокатывает, потомучто <Таб2> должно быть описано после слова from. А конструкции Update <...> set <...> from ... в FB1.5 в отличии от MSSQL2000 нет.


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

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


 
stud ©   (2004-07-12 15:34) [7]

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


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

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


 
stud ©   (2004-07-12 15:46) [9]


> 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 значения, а надо одно. или я не прав?


 
Johnmen ©   (2004-07-12 15:51) [10]

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


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

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

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


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

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

> --(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]
то же самое.


 
Johnmen ©   (2004-07-12 16:28) [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


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

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.


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


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

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


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

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


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

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


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

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


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

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

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


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

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


 
Johnmen ©   (2004-07-12 17:20) [21]

>VadimKV

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

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


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


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

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

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


 
Johnmen ©   (2004-07-12 17:26) [23]

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

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


 
stud ©   (2004-07-12 17:27) [24]

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


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

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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.08.08;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.035 c
1-1090944612
Прямой
2004-07-27 20:10
2004.08.08
ListView, Скрыть колонку


3-1089649478
ceval
2004-07-12 20:24
2004.08.08
сделать что бы при открытии dbf-файла в DBgrid выводилось


1-1090598058
AlexDee
2004-07-23 19:54
2004.08.08
Возведение в "сложную" степень и число "E"


14-1090309167
ИМХО
2004-07-20 11:39
2004.08.08
О теннисе


3-1089900139
Delpher
2004-07-15 18:02
2004.08.08
Таблица в таблице.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский