Помогите с SQL-запросом!
От: corpse56  
Дата: 30.06.09 13:38
Оценка:
Здравствуйте!
вот есть такой запрос:

select 
case when (tmp.MNFIELD = 200 and tmp.MSFIELD = '$a') then tmp.PLAIN end as zagl,
case when (tmp.MNFIELD = 700 and tmp.MSFIELD = '$a') then tmp.PLAIN end as avtor,
case when (tmp.MNFIELD = 899 and tmp.MSFIELD = '$p') then tmp.PLAIN end as inv,
 from
(
select A.SORT, B.PLAIN, A.MSFIELD, A.MNFIELD, B.IDMAIN

 from DATAEXTPLAIN B
 join DATAEXT A on A.ID=B.IDDATAEXT and A.IDMAIN=B.IDMAIN

where 
( (
or (A.MNFIELD = 200 and A.MSFIELD = '$a') --заглавие
or (A.MNFIELD = 700 and A.MSFIELD = '$a') --автор
or (A.MNFIELD = 899 and A.MSFIELD = '$p') --инв.номер
) 
 and B.IDMAIN =654135) --необходимый экземпляр книги
) as tmp



таблицы dataext и dataextplain имеют следующую структуру.
в dataext содержится поле SORT в котором в каждой записи идут подряд разные логические поля (заглавие, автор, место издания и т.д.). о том какое именно это логическое поле можно узнать по двум физическим полям MSFIELD и MNFIELD. (как видно из примера если MNFIELD = 200 а MSFIELD = '$a', то это заглавие). поле SORT предназначено для того чтоб сортировать по этому полю. оно не содержит пробелов знаков препинания и т.д. для того чтобы увидеть как полностью должно выглядеть значение поля, в dataext связано с dataextplain (DATAEXT.ID=DATAEXTPLAIN.IDDATAEXT) в котором полная версия поля.
вопрос в том чтобы выудить из этих таблиц данные о книге в привычном так сказать формате. т.е. не все поля вперемешку в один столбик, а по разным столбикам (а то на клиенте через чур долго это делать, хоть и не при моих объемах, но думаю что лучше если это сервер сделает). мой пример не так работает как я хотел бы. я хотел бы получить стока строк про книгу скока инвентарей есть на эту книгу и пусть остальные поля повторятся.ну вот например:
DATAEXT выглядит так:
ID....SORT.......MNFIELD........MSFIELD...IDMAIN
------------------------------------------------
1......A..........200............$a........1
2......AA.........700............$a........1
3......11.........899............$p........1
4......21.........899............$p........1
5......31.........899............$p........1
6......B..........200............$a........2
7......BB.........700............$a........2
8......41.........899............$p........2
9......51.........899............$p........2
10.....С..........200............$a........3
11.....СС.........700............$a........3
12.....51.........899............$p........3
-------------------------------------------------
DATAEXTPLAIN выглядит так:
ID....PLAIN........IDMAIN.....IDDATAEXT
---------------------------------------
1......51............3...........12
2......С,С...........3...........11
3......С.............3...........10
4......51............2...........9
5......41............2...........8
6......B,B...........2...........7
7......B.............2...........6
8......31............1...........5
9......21............1...........4
10.....11............1...........3
11.....A,A...........1...........2
12.....A.............1...........1
---------------------------------------

получить хочу вот так:

zag.....avtor.....inv....IDMAIN
-------------------------------
A.......AA........11......1
A.......AA........21......1
A.......AA........31......1
B.......BB........41......2
B.......BB........51......2
C.......CC........61......3
-------------------------------

или вот так:
zag.....avtor...IDMAIN
----------------------
A.......AA.......1
B.......BB.......2
C.......CC.......3
----------------------

а получаю вот так:
zag.....avtor.....inv......IDMAIN
---------------------------------
A.......NULL......NULL.....1
NULL....AA........NULL.....1
NULL....NULL......11.......1
NULL....NULL......21.......1
NULL....NULL......31.......1
NULL....BB........NULL.....2
B.......NULL......NULL.....2
NULL....NULL......41.......2
NULL....NULL......51.......2
--------------------- и так далее


кстати еще вопрос: как лучше получать? с инвентарями и потом их доставать из DataSet или без инвентарей и запрашивать каждый раз? наверное все таки с инвентарями. лучше немного избыточности, чем потом еще кучу запросов к базе...
а можете есть лучше способ? что-то типа поле-массив? чувствую что нет такого...
спасибо. если что-то не понятно, спрашивайте — я уточню.


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

спасибо что дочитали до сюда. всю голову сломал — помогите!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.