Главная страница
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.028 c
15-1157116119
StriderMan
2006-09-01 17:08
2006.09.24
Run-time packages и DCU


3-1153894912
ru_efim
2006-07-26 10:21
2006.09.24
Как использовать метод NextRecordSet компонента TADOStoredProc ?


2-1157266289
Mozgan
2006-09-03 10:51
2006.09.24
Числа


2-1157571270
redlord
2006-09-06 23:34
2006.09.24
моргание Timage при refresh


10-1123447573
r4dx
2005-08-08 00:46
2006.09.24
TWebBrowser и AutoSize