Текущий архив: 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.46 MB
Время: 0.185 c