Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Тривиальный 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.013 c
15-1157806975
new_user1
2006-09-09 17:02
2006.10.01
Как узнать...


1-1155708061
trych
2006-08-16 10:01
2006.10.01
Таймер


2-1158034779
Steep
2006-09-12 08:19
2006.10.01
Копирование файлов по списку


15-1157915644
hak
2006-09-10 23:14
2006.10.01
Password and Login in Dial-Up


3-1153944726
serko
2006-07-27 00:12
2006.10.01
Как работать с базой Access?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский