Этот вопрос касается общего метода в SQL, который я не могу понять, как лучше всего достичь с моим текущим пониманием языка.
Обратите внимание, что это будет работать с Oracle, в случае, если какие-либо специфичные для поставщика функции будут особенно полезны, хотя я ожидаю, что есть хороший способ сделать это с "чистым" SQL.
Краткая версия вопроса: если у меня есть условие ИЛИ для запроса, такое, что я проверяю, что значение в моей "основной" таблице A соответствует значению в таблице B или в таблице C, что является лучшим способом условно изменить (например, умножить) селекторы операторов, если значение было найдено в таблице C, а не в таблице B?
Длинная версия (с примером): В настоящее время у меня есть запрос, который выглядит примерно так (он намного сложнее, но это основная структура):
select o.value, /* other stuff... */
from orders o,
clients c
where o.client = c.pkey
and c.name = ?
Все хорошо. Однако теперь представьте, что некоторым клиентам разрешено действовать от имени других - но из-за комиссий за обработку или некоторых логических сделок, осуществляемых таким образом, не имеют полной стоимости. Таким образом, есть таблица managed_orders
со столбцами для order
, client
(оба первичных ключа к соответствующим таблицам) и другой столбец multiplier
, который представляет собой число с плавающей запятой между 0,0 и 1,0, представляющее пропорцию значения заказа это должно быть "перенесено".
Правильно - поэтому изменение вышеуказанного запроса для отображения заказов, которые либо принадлежат данному клиенту, либо управляются ими для кого-то другого, довольно просто. Однако мне нужно было бы умножить селектор o.value
на управляемый ордер на multiplier
, если это управляемый ордер, но если это классический прямой ордер, то в этом нет необходимости (или, эквивалентно, мы могли бы умножить на 1,0).
select o.value * m.multiplier /* Will not work in all cases */, /* other stuff... */
from orders o,
clients c,
managed_orders m
where (o.client = c.pkey or m.order = o.pkey)
and c.name = ?
and m.client = c.pkey
Как лучше всего добиться этого условного умножения?