Форум: "Базы";
Текущий архив: 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.044 c