Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тривиальный 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
   SELECT
ID, 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
 )

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо