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

Вниз

Выборка из разных таблиц в зависимости от условия.   Найти похожие ветки 

 
Leshiy ©   (2006-07-21 06:51) [0]

Здравствуйте.
Направьте на путь решения задачи.

Есть:
Table_a
ID, Type_tovara {1,2}

Table_b
ID, Table_a_id, Price

Table_c
ID, Table_a_id, Price

делаю быборку по table_a, и нужно в зависимости от значения поля Type_tovara выбирать Price из соответстующей таблицы.
Например:

Table_a
ID | Type_tovara
0  | 1  (выбираем цену из table_b)
1  | 2  (выбираем цену из table_с)
2  | 1  (выбираем цену из table_b)

Можно это сделать запросом (тогда - как?), или нужно использовать хранимые процедуры (тогда - буду разбираться с ХП).


 
Fay ©   (2006-07-21 07:06) [1]

Собери Table_b и Table_c в одну. И не греши больше.


 
ORMADA ©   (2006-07-21 07:17) [2]

case в FB есть ? или на крайняк decode?
в ms можно было бы извратиться а-ля
select t1.id
,        case t1.type_tovara
          WHEN 1 THEN (SELECT Price FROM Table_b t2 WHERE t1.ID=t2.Table_a_id)
          ELSE (SELECT Price FROM Table_c t3 WHERE t1.ID=t3.Table_a_id)
        END
FROM Table_a t1

НО ЛУЧШЕ подумать как и сказал Fay насчёт ПРАВИЛЬНОЙ СТРУКТУРЫ БД
а то хлебнёшь ещё...


 
Leshiy ©   (2006-07-21 07:23) [3]

База не моя (OptimaWin если кто в курсе), я пишу на нее отчет.


 
ORMADA ©   (2006-07-21 07:30) [4]

select t1.id
,        case t1.type_tovara
          WHEN 1 THEN t2.price1
          ELSE t2.price2
        END
FROM Table_a t1 INNER JOIN
 (SELECT t2.Table_a_id
 ,t2.Price as Price1
 ,t3.Price as Price2
 FROM Table_b t2
 INNER{или LEFT в зависимости от того всегда ли есть парил или нет} JOIN Table_c t3
 ON t2.Table_a_id=t3.Table_a_id) t2

ON t1.ID=t2.Table_a_id


 
ЮЮ ©   (2006-07-21 09:13) [5]


> INNER{или LEFT


А если в Table_c есть, а в Table_b нет?
Проще

FROM
 Table_a a
 LEFT JOIN  Table_b b ON (a.type_tovara = 1) AND (a.Id = b.Table_a_id)
 LEFT JOIN  Table_c c ON (a.type_tovara = 2) AND (a.Id = c.Table_a_id)


 
Leshiy ©   (2006-07-21 09:58) [6]

В итоге получилось:

select va.Ar_LongName,        
case va.ArtColorId
WHEN -1 THEN clL.price
WHEN  1 THEN cl1.price
WHEN  2 THEN cl2.price
END

FROM VirtArticules va

LEFT JOIN  ArtColorLess clL ON (va.artcolorid = -1) AND (va.ArticulID = clL.ArticulID)
LEFT JOIN  ArtMonoColor cl1 ON (va.artcolorid =  1) AND (va.ArticulID = cl1.ArticulID)
LEFT JOIN  ArtTwoColor  cl2 ON (va.artcolorid =  2) AND (va.ArticulID = cl2.ArticulID)

Все работает.

ORMADA, ЮЮ - СПАСИБО БОЛЬШОЕ.


 
Desdechado ©   (2006-07-21 11:36) [7]

имхо, удобнее через UNION ALL
SELECT ...
FROM Table_a a, Table_b b
WHERE (a.type_tovara = 1) AND (a.Id = b.Table_a_id)
UNION ALL
SELECT ...
FROM Table_a a, Table_c c
WHERE (a.type_tovara = 1) AND (a.Id = c.Table_a_id)


 
Leshiy ©   (2006-07-21 12:46) [8]

Блин...
Если про case я ничего не знал (работаю с IB/FB совсем недавно), то про union совсем забыл.
Самое интересное, что в этом запросе я его использую, :) в другом месте т.к. это лишь кусочек основного зопроса.

Desdechado - Спасибо, что напомнил.

З.Ы.
хотя, учитывая специфику запроса в целом - с case будет удобнее.


 
Desdechado ©   (2006-07-21 12:49) [9]

Не уверен, но, возможно, с case будет тормознутей. Хотя вполне возможно, что оптимизатор сам перекроит его в union



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

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

Наверх




Память: 0.49 MB
Время: 0.026 c
3-1153450269
Leshiy
2006-07-21 06:51
2006.09.24
Выборка из разных таблиц в зависимости от условия.


2-1157371407
Ефимыч
2006-09-04 16:03
2006.09.24
Подскажите, как сделать, чтоб jpeg не компилировался в exe-шник?


2-1156955162
NGPOL
2006-08-30 20:26
2006.09.24
Снова о DLL


2-1157113761
Серге И
2006-09-01 16:29
2006.09.24
Помогите определить количество суббот????


2-1157193706
SergP.
2006-09-02 14:41
2006.09.24
Почему компилятор показывает Hint?