Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.01;
Скачать: CL | DM;

Вниз

Тривиальный SQL-запрос   Найти похожие ветки 

 
RomanH ©   (2006-07-28 11:57) [0]

Доброго дня мастера.Имеется две таблицы
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


 
ЮЮ ©   (2006-07-28 12:07) [1]

where
 not exists(
   ...
 )

 OR exists(
   ... AND Table2.T2_price=0
 )

З.Ы. А почему бы такие записи не удалить? Если по нулевой цене продавать не хотите, как в прайсе объявлено?


 
RomanH ©   (2006-07-28 12:14) [2]


> ЮЮ ©


В Table2 мы можем определить скидку на товар из Table2 либо назначить цену


 
ЮЮ ©   (2006-07-28 12:16) [3]

см.
http://delphimaster.net/view/3-1153450269/

Т.е. присоединяй обе таблицы, а там уж анализируй зпачение полей


 
roottim ©   (2006-07-28 12:30) [4]

может так ?
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


 
PEAKTOP ©   (2006-07-28 13:31) [5]


> roottim ©   (28.07.06 12:30) [4]

Просветите темного, InterBase 7.5 поддерживает select  from select ?
Я слышал, что этот о-ракловский наворот вроде появился только в Firebird 2.0. А про InterBase не слышал.


 
roottim ©   (2006-07-28 13:43) [6]

вид, поцедура доступны. Хотя я смотрю Language Reference IB6? может FB имеет иную отличительную особенность.


 
PEAKTOP ©   (2006-07-28 16:29) [7]

Вот-с, хочу выбрать все ТМЦ (TABL$R_TMC) и контрагнетов (TABL$R_CS) в один набор данных.

CREATE PROCEDURE DUMMY
RETURNS (
   ID INTEGER,
   NAME VARCHAR(255)
   )
AS
BEGIN

 FOR
   SELECT
ID, NAME
   FROM   (SELECT CS.ID, CS.NAME FROM TABL$R_CS CS
           UNION ALL
           SELECT T.ID, T.NAME FROM TABL$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.


 
PEAKTOP ©   (2006-07-28 16:31) [8]

Собственно, почему меня и заинтересовала эта функция. В некоторых случаях очень не хватает.


 
roottim ©   (2006-07-28 16:46) [9]

с 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 17:01) [10]


> с FB давненько не занимаюсь и попробоавть негде. Но может ....

А я, блин, вовек бы не догадался.....

Выше приведен пример того, что Firebird не поддерживает конструкцию select from select, вот я и хотел спросить, есть ли эта функция в InterBase.
Ответ сам уже нашел на SQL.RU:нет ее там и не было никогда. Может быть, в Vulcan появиться (Firebird-e 2.0). Говорят, есть вроде в Firacle (клон Firebird, а точнее - мутант, появившийся после скрещивания исходников Firebird и спецификации SQL для Oracle). Но я "уродцев" че-то не долюбливаю в виду непредсказумости поведения в нек. случаях.

В общем, зря я задал этот вопрос.... Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2006.10.01;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.049 c
3-1154272548
Игорь123
2006-07-30 19:15
2006.10.01
Как запустить готовый sql сценарий в mySQL


2-1158164788
SergP
2006-09-13 20:26
2006.10.01
присвоить значение некоторым полям записи...


15-1158064876
Некто
2006-09-12 16:41
2006.10.01
А у нас тут взрыв в соседнем доме.... сидим, боимся....


6-1147041602
socketlamer
2006-05-08 02:40
2006.10.01
закачка с нескольких


15-1157918868
Alx2
2006-09-11 00:07
2006.10.01
Игорь Шевченко, поздравляю с юбилем!!!