![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Update на основе данных другой таблицы??? [IB6.x]
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]Д Л Я Ч Е Г О В Ы В С Ё Э Т О Х О Т И Т Е С Д Е Л А Т Ь??????