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

Вниз

Помогите с SQL запросом   Найти похожие ветки 

 
jack128 ©   (2006-04-11 14:47) [0]

День добрый.  Такой вопросик возник

есть таблицы

materials (id, caption...)
generalizations (id, caption, period_id)
generalization_material_links (material_id, generalization_id)

для каждого материала на каждый период может быть задано одно обобщение (generalization) (но не обязательно).

Задача - выбрать все материалы  + дополнительной колонкой id обобщения на заданный период.

например

materials
id  caption
 0  битон марки А
 1  битон марки Б
 2  битон марки В
 3  битон марки Д
 4  битон марки Е


generalizations
 id  caption       period
 0  обощение 1       1
 1  обощение 2       2
 2  обощение 3       1


generalization_material_links
 material_id generalization_id
    1                0
    2                1
    3                0
    3                1
    4                2


SQL.ParamByName("period_id").AsInteger := 0;
результат должен быть следующим

 material_id  material_caption  generalization_id
   0            битон марки А        null                
   1            битон марки Б         0
   2            битон марки С        null
   3            битон марки Д         0
   4            битон марки Е         2  


 
Desdechado ©   (2006-04-11 15:46) [1]

СУБД какая?
не понял также, нужно выбрать только одно обобщение? какое тогда?
и почему для периода 0, если он в таблице отсутствует, вдруг результат с обобщениями появился?

а так видится select ... left outer join (select ... )


 
Johnmen ©   (2006-04-11 15:50) [2]

Тут несколько непонятных (ошибочных?) моментов.

1. марки В и С
2  битон марки В
и
2            битон марки С

2.
SQL.ParamByName("period_id").AsInteger := 0;
но такого периода нет. Откуда же получим данные?


 
jack128 ©   (2006-04-11 23:47) [3]

Johnmen ©   (11.04.06 15:50) [2]
SQL.ParamByName("period_id").AsInteger := 0;
но такого периода нет. Откуда же получим данные?

Ох. Сглючил.  Естественно имелось в виду SQL.ParamByName("period_id").AsInteger := 1;
Desdechado ©   (11.04.06 15:46) [1]
СУБД какая?

IB/FB
Desdechado ©   (11.04.06 15:46) [1]
не понял также, нужно выбрать только одно обобщение? какое тогда?

да, только одно.  ТО, которое соответствует материалу в текущем периоде.такое обобщение может быть только одно(или же null - если такого обобщения нет вообще)


 
SergP.   (2006-04-12 02:04) [4]

наверное так:


SELECT a.id, a.caption, d.generalization_id
FROM materials a
LEFT JOIN
(select c.*
from generalization_material_links c, generalizations b
where c.generalization_id=b.id and b.period=:period_id) d
ON a.id=d.material_id;


Не знаю как в IB/FB, но акцесс такое хавает...


 
SergP ©   (2006-04-12 02:21) [5]

Хм... Только что заметил... Топикстартер без комплексов однако.

Вспомнилась ветка одного из обычных посетителей, который сильно обижался на действия модераторов...


 
Johnmen ©   (2006-04-12 10:33) [6]


SELECT
 M.id,
 M.caption,
 (SELECT L.generalization_id FROM generalization_material_links L
 JOIN generalizations G ON G.id=L.generalization_id
 WHERE (L.material_id=M.id) AND (G.period=1))
FROM materials M


 
jack128 ©   (2006-04-12 10:36) [7]

SergP ©   (12.04.06 2:21) [5]
нет, FB такое не хавает.

Вчера ребята меня надоумили( Ega23, paul_k - спасибо)  и вот что получилось:

select m.id as material_id, m.caption, gml.generalization_id
from generalization_material_links gml
 join generalizations g on g.id = gml.generalization_id and g.period_id = :period_id
 right join materials m on m.id = gml.material_id

работает вроде правельно.

похожий вариант у меня был:  

select m.id as material_id, m.caption, gml.generalization_id
from materials m
 left join generalization_material_links gml on gml.material_id = m.id
 join generalizations g on g.id = gml.generalization_id and g.period_id = :period_id

проблема как видно была в порядке объединений.  Мне нужно было сначала сделать inner join, а потом уже left.  А реально в этом запросе сначала выполняется left, а потом к результату применяется inner . в результате отсекаются материалы, для которых не задано обобщение в текущем периоде..

Отсюда вопрос: замена left join на right - это стандартный способ изменнения порядка объединений???


 
jack128 ©   (2006-04-12 10:40) [8]

Johnmen ©   (12.04.06 10:33) [6]

Ндя.. Как всегда..  Я тут извращаюсь, страшные запросы пишу, а всё решается простеньким подзапросом...


 
Johnmen ©   (2006-04-12 10:49) [9]

>jack128 ©   (12.04.06 10:40) [8]

Кстати, запрос в [7], который "работает вроде правельно", наиболее правильное идеологически решение.
А то, что я привёл, просто его аналог, записанный в "другом порядке" :)


 
jack128 ©   (2006-04-12 22:51) [10]

Johnmen ©   (12.04.06 10:49) [9]
Кстати, запрос в [7], который "работает вроде правельно", наиболее правильное идеологически решение

Может быть.  Но работает он в 8 медленнее.  2,3 сек против 0,3 - для твоего запроса..



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

Форум: "Начинающим";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
15-1144345079
X9
2006-04-06 21:37
2006.04.30
Opera и дайджесты


3-1141401246
_RusLAN
2006-03-03 18:54
2006.04.30
TIBScript. Отобразить процесс выполнения скрипта.


15-1144295698
Карелин Артем
2006-04-06 07:54
2006.04.30
Выбор MP3-плеера. На какие параметры смотреть?


2-1144731535
Neiroman
2006-04-11 08:58
2006.04.30
Random()


2-1144989813
alk
2006-04-14 08:43
2006.04.30
работа с ini файлом





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