0xb800 |
Отправлено: 15.08.2005, 13:51 |
|
Не зарегистрирован
|
Здравствуйте, Все !
Я — новичок (BCB 6, Interbase 6.5) и сразу с просьбой: помогите с запросом, пожалуйста:
Физический смысл задачи — исследование объектов, каждый из которых состоит из какого-то числа компонентов.
В базе есть таблица Components:
CODE |
Id, // PK
Ex_Id, // Id исследования
CList_Id, // Id компонента в списке компонентов
Obj_Id, // Id объекта
Test_Id, // Id пробы
Test_No, // порядковый номер пробы
Peak, // некая характеристика компонента
PTime // время обнаружения Peak
|
Больше трёх проб не делаем, результаты проб отображются в DBGridEh в таком виде:
CODE |
Наименование | ПЛОЩАДИ ПИКОВ | ВРЕМЯ ВЫХОДА
компонента | ------------------------------------------------------------
| Проба 1 | Проба2 | Проба3 | Проба1 Проба2 Проба3
---------------- | --------------|---------------|---------------|---------
Компонент_1 | 135,987 | 134,544 | 136,455 | 0:05:32
...
Компонент_N | 326,653 | 328,242 | 322,542 | 0:09:56 и так далее
|
Запрос для трёх, например, проб (лучше ничего смог придумать):
SQL | select cl.C_Name, frs.Peak, sec.Peak, thr.Peak, frs.PTime, sec.PTime, thr.PTime
from comp_list cl, components frs, components sec, components thr
where (
cl.id=frs.clist_id and (frs.Inj_No=1 and frs.Obj_Id=:OBJ_ID) and (sec.Inj_No=2 and sec.Obj_Id=:OBJ_ID) and (thr.Inj_No=3 and thr.Obj_Id=:OBJ_ID) and frs.CList_Id=sec.CList_Id and frs.CList_Id=thr.CList_Id and )
ORDER BY PTime
|
Когда в каждой из трёх проб получаем одно и то же множество компонентов, всё нормально.
Когда в одной из проб появляется компонент, который не был обнаружен в других пробах, перестаёт выполняться условие запроса (frs.CList_Id=sec.CList_Id and frs.CList_Id=thr.CList_Id).
Вопрос: как сделать, чтобы в столбце компонентов получить все компоненты, обнаруженные во всех пробах, а в остальных столбцах — соответствующие им значения (или NULL, если данного компонента в пробе не обнаружено) ? |
|
Guest |
Отправлено: 18.08.2005, 21:31 |
|
Не зарегистрирован
|
Сам спросил — сам отвечаю (если кому-то интересно) ;-)
Поля, которые в описании таблицы я обозвал "Test_Id" и "Test_No", на самом деле — Inj_Id и Inj_No (извините...)
Таблица comp_list: — простой справочник (integer id, varchar c_name).
Вот такой запрос — всё равно, для трёх, двух или одной пробы:
SQL | Select cl.c_name,
(Select peak From components frs Where (frs.inj_no = 1 And frs.obj_id = :OBJ_ID And cl.id = frs.clist_id)),
(Select peak From components sec Where (sec.inj_no = 2 And sec.obj_id = :OBJ_ID And cl.id = sec.clist_id)),
(Select peak From components thr Where (thr.inj_no = 3 And thr.obj_id = :OBJ_ID And cl.id = thr.clist_id))
From comp_list cl
Where cl.id In (
Select clist_id
From components Where (Obj_Id=:OBJ_ID)
)
| |
|
|