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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.046 c
2-1157024256
2face
2006-08-31 15:37
2006.09.24
Ошибка


3-1153385859
Mintos
2006-07-20 12:57
2006.09.24
Отчет с отчета (QuikReport)


15-1157381073
Agent13
2006-09-04 18:44
2006.09.24
Глюки винчестера или неудачный запуск Windows


15-1157131916
Dbn
2006-09-01 21:31
2006.09.24
Проблема с компом, точнее с подключеним в интернет.


2-1157106503
lorn
2006-09-01 14:28
2006.09.24
прибавить время к дате





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский