View... с условием?
Добавлено: 06 июл 2005, 22:30
SQL-сервер - InterBase 6.0
Есть таблица:
main
(
id integer not null,
value double precision
need_ratio1 char(1) check (need_ratio1 in ('y', 'n')) not null,
need_ratio2 char(1) check (need_ratio2 in ('y', 'n')) not null,
...
need_ratioX char(1) check (need_ratioX in ('y', 'n')) not null,
primary key (id)
)
И несколько таблиц вида:
ratioX
(
main_id integer not null,
ratio double precision,
foreign key (main_id) references main (id)
)
Структура таблиц вообще-то сложнее, но я упростил её, убрав ненужное для понимания проблемы. На самом деле эта структура не так глупа, таблицы ratioX содержат также другую информацию, нужную для других таблиц.
Задача: нужно создать представление (view), которое выводило бы поле main.value, значения которого были бы умножены на соответствующие через связь (ratioX.main_id -> main.id) значения полей ratio тех таблиц ratioX, для которых в таблице main значение поля need_ratioX равно 'y'. Т. е. если, например, значения всех полей need_ratioX равны 'n', то результатом должно быть просто поле main.value. Этих таблиц будет не так много, т. е. проблема не в том, чтобы их все перечислить, а в том, чтобы умножать значение поля на значение другого поля только при условии need_ratioX = 'y'.
При этом, если значение поля need_ratioX устанавливается на 'n', нельзя просто сделать ratioX.ratio равными 1, т. е. нужно сохранить информацию таблиц ratioX.
Можно было бы создать хранимую процедуру и выполнять там проверку условия, но, насколько я понимаю, в представлении нельзя использовать процедуры, по крайней мере, в InterBase.
Можно ли решить эту задачу посредством SQL плюс, может быть, каких-нибудь расширений InterBase?
PS: тип полей need_ratioX в таблице main некритичен, и его можно изменить на какой-нибудь другой, только необходимо иметь два возможных значения для различия.
Есть таблица:
main
(
id integer not null,
value double precision
need_ratio1 char(1) check (need_ratio1 in ('y', 'n')) not null,
need_ratio2 char(1) check (need_ratio2 in ('y', 'n')) not null,
...
need_ratioX char(1) check (need_ratioX in ('y', 'n')) not null,
primary key (id)
)
И несколько таблиц вида:
ratioX
(
main_id integer not null,
ratio double precision,
foreign key (main_id) references main (id)
)
Структура таблиц вообще-то сложнее, но я упростил её, убрав ненужное для понимания проблемы. На самом деле эта структура не так глупа, таблицы ratioX содержат также другую информацию, нужную для других таблиц.
Задача: нужно создать представление (view), которое выводило бы поле main.value, значения которого были бы умножены на соответствующие через связь (ratioX.main_id -> main.id) значения полей ratio тех таблиц ratioX, для которых в таблице main значение поля need_ratioX равно 'y'. Т. е. если, например, значения всех полей need_ratioX равны 'n', то результатом должно быть просто поле main.value. Этих таблиц будет не так много, т. е. проблема не в том, чтобы их все перечислить, а в том, чтобы умножать значение поля на значение другого поля только при условии need_ratioX = 'y'.
При этом, если значение поля need_ratioX устанавливается на 'n', нельзя просто сделать ratioX.ratio равными 1, т. е. нужно сохранить информацию таблиц ratioX.
Можно было бы создать хранимую процедуру и выполнять там проверку условия, но, насколько я понимаю, в представлении нельзя использовать процедуры, по крайней мере, в InterBase.
Можно ли решить эту задачу посредством SQL плюс, может быть, каких-нибудь расширений InterBase?
PS: тип полей need_ratioX в таблице main некритичен, и его можно изменить на какой-нибудь другой, только необходимо иметь два возможных значения для различия.