Страница 1 из 1

View... с условием?

Добавлено: 06 июл 2005, 22:30
skipsi
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 некритичен, и его можно изменить на какой-нибудь другой, только необходимо иметь два возможных значения для различия.

Добавлено: 06 июл 2005, 22:41
kdv
а почему бы вместо main (или в дополнение) не сделать таблицу, где вместо need_ratio1...need_ratiox будет

id
ratio_id
ratio

? наличие в таблице field1, field2, field3 и т.п. - уже признак того, что столбцы надо разносить на строки. Рекомендую Дейта почитать.

Re: View... с условием?

Добавлено: 07 июл 2005, 08:21
sag
skipsi писал(а):Можно ли решить эту задачу посредством SQL плюс, может быть, каких-нибудь расширений InterBase?
Можно. А view необходимо?
Про IB6.0 не спрашиваю, но сочувствую. На современных версиях твоя задача решалась бы совсем просто (например, воспользовавшись case-ами). На функционале IB6.0 то же можно сделать, но придется использовать udf. Например так:

Код: Выделить всё

select main.value*nvl_x(ratioX.ratio,1)
from main left join ratioX 
on (main.id=ratioX.main_id and main.need_ratioX='y') ....
где, nvl_x- некая абстрактная udf.
Мне не ведомо, могут ли в ratioX.ratio содержаться null-ы или нули, этот пример для случая когда это поле not null и !=0. Если возможны варианты, то надо применить другие udf, например, iif-подобные.
Надеюсь, принцип понятен.