C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите с запросом, пожалуйста
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)
)

Вернуться в Работа с базами данных в C++Builder