Страница 1 из 1
Работа с вычисляемыми полями
Добавлено: 07 авг 2009, 13:15
Guardian777
Добрый день.
Windows XP Prof
Firebird 1.5
Возник следующий вопрос.
Требуется вычислить значение столбца на основе данных из другой таблицы. В книге Хелен Борри упомянается что можно для вычисления использовать SELECT. Но проблема заключается в том что ести мы пишем запрос типа (SELECT G.NAC FROM GROUP G WHERE G.KODT = KODT) , то берется только первое значение из столбца KODT
Есть ли варианты решения данной задачи без написания пользовательской UDF ?
Re: Работа с вычисляемыми полями
Добавлено: 07 авг 2009, 14:23
Dimitry Sibiryakov
1) View
2) Trigger
3) DB Developer
Re: Работа с вычисляемыми полями
Добавлено: 07 авг 2009, 20:49
kdv
к ответу DS добавлю, что UDF - нет, не сможете. И вообще select в вычисляемых полях это ужасно (с точки зрения производительности). Никогда так не делайте.
Re: Работа с вычисляемыми полями
Добавлено: 10 авг 2009, 12:10
Guardian777
Что использовать лучше Просмотр или триггер?
Я понимаю это так. Если использовать просмотры то получается что мы избавляемся от избыточных данных и их вычислений в ходе изменения данных.
Если же использовать триггеры, то мы получаем лишнее поле, но выигрываем в скорости исполнения запроса основанного на этих полях.
Re: Работа с вычисляемыми полями
Добавлено: 10 авг 2009, 16:32
kdv
триггер хуже view тем, что пресловутый select будет выполняться так же как и check constraint. Собственно, check constraint, грубо говоря, и есть "системный триггер". View или запрос лучше тем, что "вычисляемый столбец" будет вычисляться только при выборке, и только когда это нужно.
Кроме того, может быть изменится Ваше представление о правилах "программирования" метаданных. Например, есть такая штука - join (
www.ibase.ru/devinfo/joins.htm).
Re: Работа с вычисляемыми полями
Добавлено: 10 авг 2009, 19:39
WildSery
Присоединяюсь к совету с JOIN. Пока не выучите что это - никаких вычисляемых полей.
Re: Работа с вычисляемыми полями
Добавлено: 11 авг 2009, 09:29
Guardian777
kdv писал(а):триггер хуже view тем, что пресловутый select будет выполняться так же как и check constraint. Собственно, check constraint, грубо говоря, и есть "системный триггер". View или запрос лучше тем, что "вычисляемый столбец" будет вычисляться только при выборке, и только когда это нужно.
Кроме того, может быть изменится Ваше представление о правилах "программирования" метаданных. Например, есть такая штука - join (
http://www.ibase.ru/devinfo/joins.htm).
1) Статью читал уже до этого, шяс перечитал. Но по моему мы немного друг друга не понимаем.
2) Подумав пришел к выводу что в моем случае лучше использовать триггер. Поясню почему.
Есть таблица товаров и таблица элементов из которых состоит товар. У каждого элемента есть своя цена. Цена товара получается путем сложения цен элементов. Тут то и начинается самое интересное.
Дорпустим есть 3000 товаров в каждом в среднем 6 элементов.
Мы забили справочник товаров и их комплектующих.
2.1) Используем триггер.
Изменили 5 товаров. В таблице
товаров справочник поменял в соответствии с условиями (наценка/скидка) цены 5 ти товаров. Потом сделали выборку всех товаров для визуального отображения в программе без выборки составляющих. Выборка прошла мгновенно т.к. все данные есть и ничего высчитывать не надо.
2.2) Используем View.
Изменили теже 5 товаров. Делаем выборку для просмотра и получаем что для того чтобы собрать данные нашего SELECT надо выполнить 3000 ! запросов в дочернюю таблицу.
А если учесть что в реальных базах товаров десятки тысяч то ......