samosyn
Дата: 19.12.2011 19:16:34
День добрый,
Есть две таблицы:
Rocks
num, min_id1, min_id2, min_id3
и Minerals
id, name
Первая хранит нумерованные наборы идентификаторов минералов, входящих в состав породы, вторая - справочник минералов. Необходимо вывести в отчет соответственно num, name, name, name, подставив, соответственно, вместо id-шников минералов их названия из справочника
Как написать такой селект?
Ну или может быть в отчетах как-то можно это сделать без творчества с запросами?
Заранее благодарен за помощь!
samosyn
Дата: 21.12.2011 11:06:25
Akina,
Всё круто, но не работает на случай, если не все поля min_id* заполнены. То есть, например, если есть скажем четыре записи (num,min_id1,min_id2,min_id3):
(1001,22,7,)
(1002,4,13,5)
(1003,,,) и
(1004,35,,)
То итогом должны стать всё те же 4 записи:
1001, Кварц, Кальцит,
1002, Алунит, Эпидот, Апатит
1003, , ,
1004, Галенит
А селект как у Вас дает только одну запись, 1002, где все поля непустые
Здесь видимо нужен какой-то JOIN, но я в этом совсем не разбираюсь... =(
samosyn
Дата: 21.12.2011 11:11:56
qwerty112,
Между этими таблицами действительно связь многие-ко-многим, поскольку один образец может содержать несколько менералов и один минерал может содержаться в нескольких образцах. Но в данном контексте дело "было не в бобине", конечно, так что смейтесь.. Но лучше бы рассказали как прикреплять справочники к листбоксам в отчетах - у меня не получилось.
mds_world
Дата: 21.12.2011 11:21:08
samosyn,
добавьте в условие запроса Akina проверку на NULL
select t1.num, t2.name as name1, t3.name as name2, t.name as name3
from Rocks t1, Minerals t2, Minerals t3, Minerals t4
where (t1.min_id1 = t2.id or t1.min_id1 is null)
and (t1.min_id2 = t3.id or t1.min_id2 is null)
and (t1.min_id3 = t4.id or t1.min_id3 is null)
mds_world
Дата: 21.12.2011 12:41:29
Да, погнал я.

Но можно сделать через перекрестный запрос с юнион-подзапросом
transform first([name]) as a
select q.num
from
(select 1 as nom, t1.num, min_id1 as idm from Rocks t1
union all
select 2, t1.num, min_id2 from Rocks t1
union all
select 3, t1.num, min_id3 from Rocks t1
order by num) q inner join Minerals t1 on q.idm=t1.id
group by q.num
pivot "Минерал" & nom