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

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

Выборка из разных таблиц в зависимости от условия. [FB 1.5]


Leshiy ©   (2006-07-21 06:51:00) 

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

Есть:
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)

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


Desdechado   (2006-07-21 12:49:00) [1]

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


Leshiy   (2006-07-21 12:46:00) [2]

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

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

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


Desdechado   (2006-07-21 11:36:00) [3]

имхо, удобнее через 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 09:58:00) [4]

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

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, ЮЮ - СПАСИБО БОЛЬШОЕ.


ЮЮ   (2006-07-21 09:13:00) [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)


ORMADA   (2006-07-21 07:30:00) [6]

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


Leshiy   (2006-07-21 07:23:00) [7]

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


ORMADA   (2006-07-21 07:17:00) [8]

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 насчёт ПРАВИЛЬНОЙ СТРУКТУРЫ БД
а то хлебнёшь ещё...


Fay   (2006-07-21 07:06:00) [9]

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


Наверх

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