![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тривиальный SQL-запрос [D7, IB7.5]
RomanH © (2006-07-28 11:57:00)Доброго дня мастера.Имеется две таблицы
Table1:
T1_ID,T1_Tovar_ID,T1_price,T1_discount (по default=0.0)
и Table2:
T2_ID,T2_Tovar_ID,T2_price,T2_discount,T2_Firm_ID
То есть Table1-основной прайс-лист,а Table2 прайс-лист для каких то покупателей где мы можем определить скидку на какой либо товар. Делаю такой запрос
select Table1.T1_Tovar_ID,
Table1.T1_Price,
Table1.T1_discount
from Table1
where not exists(select 1 from Table2
where Table2.T2_Tovar_ID=Table1.T1_Tovar_ID
and Table2.T2_Firm_ID=:Firm)
union
select Table2.T2_Tovar_ID,
Table2.T2_Price,
Table2.T2_discount
from Table2;
То есть этот запрос объеденяет два прайса но если есть запись во втором прайсе на какой-либо товар мы из первого не выбираем его.
Вопрос:Ни как не соображу,как сделать если Table2 T2_price=0 то надо выбрать из T1_price то есть
Как реализовать такую конструкцию
select Table1.T1_Tovar_ID,
Table1.T1_Price,
Table1.T1_discount
from Table1
where not exists(select 1 from Table2
where Table2.T2_Tovar_ID=Table1.T1_Tovar_ID
and Table2.T2_Firm_ID=:Firm)
union
select Table2.T2_Tovar_ID,
(if Table2.T2_price=0 then select Table1.T1_price
from Table1
where Table1.T1_Tovar_ID=Table2.T2_Tovar_ID)
Table2.T2_discount
from Table2
PEAKTOP (2006-07-28 17:01:00) [1]
> с FB давненько не занимаюсь и попробоавть негде. Но может ....
А я, блин, вовек бы не догадался.....
Выше приведен пример того, что Firebird не поддерживает конструкцию select from select, вот я и хотел спросить, есть ли эта функция в InterBase.
Ответ сам уже нашел на SQL.RU:нет ее там и не было никогда. Может быть, в Vulcan появиться (Firebird-e 2.0). Говорят, есть вроде в Firacle (клон Firebird, а точнее - мутант, появившийся после скрещивания исходников Firebird и спецификации SQL для Oracle). Но я "уродцев" че-то не долюбливаю в виду непредсказумости поведения в нек. случаях.
В общем, зря я задал этот вопрос.... Всем спасибо.
roottim (2006-07-28 16:46:00) [2]с FB давненько не занимаюсь и попробоавть негде. Но может -
CREATE PROCEDURE DUMMY
RETURNS (
ID INTEGER,
NAME VARCHAR(255)
)
AS
BEGIN
FOR SELECT CS.ID, CS.NAME FROM TABL$R_CS CS INTO :ID, :NAME
DO
SUSPEND;
FOR SELECT T.ID, T.NAME FROM TABL$R_TMC T INTO :ID, :NAME
DO
SUSPEND;
END
PEAKTOP (2006-07-28 16:31:00) [3]Собственно, почему меня и заинтересовала эта функция. В некоторых случаях очень не хватает.
PEAKTOP (2006-07-28 16:29:00) [4]Вот-с, хочу выбрать все ТМЦ (TABL$R_TMC) и контрагнетов (TABL$R_CS) в один набор данных.
CREATE PROCEDUREDUMMY
RETURNS(
ID INTEGER,
NAME VARCHAR(255)
)
AS
BEGIN
FOR
SELECTID, NAME
FROM ( SELECTCS.ID, CS.NAME FROMTABL$R_CS CS
UNION ALL
SELECTT.ID, T.NAME FROMTABL$R_TMC T
)
INTO:ID, :NAME
DO
SUSPEND;
END
1) Ошибка препроцессора IBExpert (v2006-06-03)
select ... from (select ...) not supported
2) Если продолжаем компиляцию, ошибка Firebird (v1.5.3.4870)
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 10, char 13.
SELECT.
roottim (2006-07-28 13:43:00) [5]вид, поцедура доступны. Хотя я смотрю Language Reference IB6? может FB имеет иную отличительную особенность.
PEAKTOP (2006-07-28 13:31:00) [6]
> roottim © (28.07.06 12:30) [4]
Просветите темного, InterBase 7.5 поддерживает select from select ?
Я слышал, что этот о-ракловский наворот вроде появился только в Firebird 2.0. А про InterBase не слышал.
roottim (2006-07-28 12:30:00) [7]может так ?
select
p.Tovar_ID,
max(p.Price) Price,
max(p.discount) discount
from (
select Table1.T1_Tovar_ID Tovar_ID,
Table1.T1_Price Price,
Table1.T1_discount discount
from Table1 union all
select Table2.T2_Tovar_ID Tovar_ID,
Table2.T2_Price Price,
Table2.T2_discount discount
from Table2 where Table2.T2_Firm_ID=:Firm
) p group by Tovar_ID
ЮЮ (2006-07-28 12:16:00) [8]см.
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1153450269&n=1
Т.е. присоединяй обе таблицы, а там уж анализируй зпачение полей
RomanH (2006-07-28 12:14:00) [9]
> ЮЮ ©
В Table2 мы можем определить скидку на товар из Table2 либо назначить цену
ЮЮ (2006-07-28 12:07:00) [10]where
not exists(
...
)
OR exists(
... AND Table2.T2_price=0
)
З.Ы. А почему бы такие записи не удалить? Если по нулевой цене продавать не хотите, как в прайсе объявлено?