SHAPE {select FIELDONE,FIELDTWO from TABLEA} AS ParentCMD APPEND ({select FIELDONETWO,FIELDTWOTWO from TABLEB} AS ChildCMD RELATE FIELDONE TO FIELDONETWO) AS ChildCMD
Rojohn писал(а):Рассказываю ещё проще:
Есть 3 таблицы: Предметы, Документы1 на предметы, Документы2 на предметы. Есть 2 связующие таблицы (1 предмет ко многим документам каждого вида). На один предмет могут быть выданы либо один из этих двух документов, либо оба, либо ниодного. Нужно вывести в одну строку сведения о Предмете и соответствующие ему номера документов. Если документов нет - выводить пустые значения номеров.
Не думаю, что тут дело только в Join-ах...
SELECT Предметы.ИД, Документы1.ИД, Документы2.ИД
FROM (Предметы П LEFT JOIN Документы1 Д1 ON П.ИД = Д1.ИД_Предмета) LEFT JOIN Документы2 Д2 ON П.ИД = Д2.ИД_Предмета
alibek писал(а):Не самый удачный вариант, для случая, когда выдано два документа, будет возвращаться две записи (или четыре).
В случае Access я бы советовал использовать перекрестные запросы, они тут хорошо подойдут.
А вообще тебе нужен довольно сложный джойн между Документы1 и Документы2, а уже с результатами этой выборки надо джойнить Предметы.
Я бы советовал изменить структуру базы данных, она не очень удачная.
select
p.title,
d1.title,
d2.title
from
Predmet p
left join pd1 pd1 on pd1.pr_id = p.id
left join document1 d1 on d1.id = pd1.d1_id
left join pd2 pd2 on pd2.pr_id = p.id
left join document2 d2 on d2.id = pd2.d2_id
Если на одно оружие есть несколько документов одного вида, то выводится новая строка с повтором предмета
SELECT (type_gun.title & ' ' & code_gun.model_title) AS gun_title, gun.SERIES AS gun_series, gun.NUMB AS gun_numb, gun.MAKE_YEAR AS gun_year, gun.PER_DATE AS gun_date, GSTATUS.TITLE AS gun_status
FROM (permission_gun INNER JOIN (history_gun INNER JOIN GSTATUS ON history_gun.GSTATUS_CODE = GSTATUS.CODE) ON (permission_gun.PPERSON_ID = history_gun.PPERSON_ID) AND (permission_gun.GUN_ID = history_gun.GUN_ID)) INNER JOIN ((gun INNER JOIN code_gun ON gun.CODEGUN_CODE = code_gun.CODE) INNER JOIN type_gun ON code_gun.TYPE_GUN_CODE = type_gun.CODE) ON history_gun.GUN_ID = gun.ID
GROUP BY (type_gun.title & ' ' & code_gun.model_title), gun.SERIES, gun.NUMB, gun.MAKE_YEAR, gun.PER_DATE, GSTATUS.TITLE, permission_gun.PERMIS_NUMB, permission_gun.PERMIS_SERIES, gun.UPDATED, permission_gun.PPERSON_ID
HAVING (((permission_gun.PERMIS_NUMB)=11111) AND ((permission_gun.PERMIS_SERIES)='СЕР') AND ((gun.UPDATED)<>5) AND ((permission_gun.PPERSON_ID)=24))
ORDER BY gun.SERIES, gun.NUMB, Max(history_gun.ID) DESC;
Немного не понял момент join pd2 pd2 - разве так пишется? Или это опечатка
join pd2 AS pd2
из таблицы История_Предметов, у которого ID максимальный
inner join (select GUN_ID, max(id) AS ID ... from history_gun group by GUN_ID) history_gun on ...
HandKot писал(а):из таблицы История_Предметов, у которого ID максимальный
цепляйте не саму таблицу а только выборку для предмета с макимальным ID
- Код: Выделить всё
inner join (select GUN_ID, max(id) AS ID ... from history_gun group by GUN_ID) history_gun on ...
Состояние предмета из таблицы История_Предметов (с максимальным ID).
Я и пытался это сделать, но куда это писАть? не очень понимаю...
select
field1,
field2,
(select top1 filed from histiry where history.predmet = predmet.predmet order by histiry.id desc)
...
from
predmet
...
select
predmet,
field
from
history h
inner join (
select
predmet,
max(id) max_id
from
history
group by
predmet) max_hist on max_hist.predmet = history.predmet and max_hist.max_id = history.id
SELECT (type_gun.title & ' ' & code_gun.model_title) AS gun_title, gun.series AS gun_series, gun.numb AS gun_numb, gun.make_year AS gun_year, gun.PER_DATE AS gun_date,
(SELECT TOP 1 gstatus.title FROM gstatus,history_gun WHERE ((history_gun.gun_id=gun.id) AND (gstatus.code=history_gun.gstatus_code)) ORDER BY history_gun.id DESC) AS gun_status, permission_gun.gun_id
FROM permission_gun INNER JOIN ((gun INNER JOIN code_gun ON gun.CODEGUN_CODE = code_gun.CODE) INNER JOIN type_gun ON code_gun.TYPE_GUN_CODE = type_gun.CODE) ON permission_gun.GUN_ID = gun.ID WHERE (((permission_gun.PERMIS_NUMB)=111111) AND ((permission_gun.PERMIS_SERIES)='ссс') AND ((gun.UPDATED)<>5) AND ((permission_gun.PPERSON_ID)=111))
ORDER BY gun.SERIES, gun.NUMB;
Select (TYPE_GUN.TITLE & ' ' & CODE_GUN.MODEL_TITLE) As CODE, GUN.SERIES, GUN.NUMB, GUN.MAKE_YEAR, GUN.PER_DATE, LICENCE_GUN.LIC_SERIES, LICENCE_GUN.LIC_NUMB, PERMISSION_GUN.PERMIS_SERIES, PERMISSION_GUN.PERMIS_NUMB, GUN.ID FROM type_gun, code_gun, gun, licence_gun, permission_gun, history_gun
WHERE ((code_gun.code = gun.codegun_code) AND (gun.id = licence_gun.gun_id) AND (gun.id = permission_gun.gun_id) AND (type_gun.code = code_gun.type_gun_code) AND ((gun.lr)='ЛР') AND ((permission_gun.cur_permis)='Да') AND ((licence_gun.cur_lic)='Да') AND ((gun.pperson_id)=" & IDfl & ") AND (licence_gun.pperson_id=" & IDfl & ") AND (permission_gun.pperson_id=" & IDfl & ") AND ((gun.updated) <> 5) AND (history_gun.id =(
SELECT TOP 1 history_gun.id
FROM history_gun
WHERE ((history_gun.gun_id = gun.id) AND (history_gun.pperson_id=" & IDfl & ") AND (history_gun.pperson_id = gun.pperson_id) AND ((history_gun.gstatus_code=6) OR (history_gun.gstatus_code=9))) ORDER BY history_gun.id DESC)))
Union
SELECT (TYPE_GUN.TITLE & ' ' & CODE_GUN.MODEL_TITLE) AS CODE, GUN.SERIES, GUN.NUMB, GUN.MAKE_YEAR, GUN.PER_DATE, LICENCE_GUN.LIC_SERIES, LICENCE_GUN.LIC_NUMB, '' AS ps, '' AS pn, GUN.ID FROM history_gun,TYPE_GUN, CODE_GUN, GUN,LICENCE_GUN WHERE ((CODE_GUN.CODE = GUN.CODEGUN_CODE) AND (TYPE_GUN.CODE = CODE_GUN.TYPE_GUN_CODE) AND (GUN.ID = LICENCE_GUN.GUN_ID) AND ((GUN.LR)='Л') AND ((LICENCE_GUN.CUR_LIC)='Да') AND ((GUN.PPERSON_ID)=" & IDfl & ") AND ((LICENCE_GUN.PPERSON_ID)=" & IDfl & ") AND ((GUN.UPDATED)<>5)) AND (history_gun.id =(
SELECT TOP 1 history_gun.id
FROM history_gun
WHERE ((history_gun.GUN_ID = GUN.ID) AND (history_gun.pperson_id=" & IDfl & ") AND (history_gun.PPERSON_ID = GUN.PPERSON_ID) AND ((history_gun.gstatus_code=6) OR (history_gun.gstatus_code=9))) ORDER BY history_gun.id DESC))
Union
SELECT (type_gun.title & ' ' & code_gun.model_title) AS code, gun.series, gun.numb, gun.make_year, gun.per_date, '' As ls,'' As ln,permission_gun.permis_series, permission_gun.permis_numb, gun.id
FROM history_gun, type_gun, code_gun, gun, permission_gun WHERE ((code_gun.code = gun.codegun_code) AND (type_gun.code = code_gun.type_gun_code) AND (gun.id = permission_gun.gun_id) AND ((gun.lr)='Р') AND ((permission_gun.cur_permis)='Да') AND ((gun.pperson_id)=" & IDfl & ") AND ((permission_gun.pperson_id)=" & IDfl & ") AND ((gun.updated)<>5)) AND (history_gun.id =(
SELECT TOP 1 history_gun.id
FROM history_gun
WHERE ((history_gun.gun_id = gun.id) AND (history_gun.pperson_id=" & IDfl & ") AND (history_gun.PPERSON_ID = GUN.PPERSON_ID) AND ((history_gun.gstatus_code=6) OR (history_gun.gstatus_code=9))) ORDER BY history_gun.id DESC))
Union
SELECT (type_gun.title & ' ' & code_gun.model_title) AS code, gun.series, gun.numb, gun.make_year, gun.per_date, '' As ls, '' As ln, '' AS ps, '' AS pn, gun.id
FROM history_gun, type_gun, code_gun, gun
WHERE ((code_gun.code = gun.codegun_code) AND (type_gun.code = code_gun.type_gun_code) AND ((GUN.LR) Is Null) AND ((gun.pperson_id)=" & IDfl & ") AND ((gun.updated)<>5)) AND (history_gun.id =(
SELECT TOP 1 history_gun.id
FROM history_gun
WHERE ((history_gun.gun_id = gun.id) AND (history_gun.pperson_id=" & IDfl & ") AND (history_gun.PPERSON_ID = GUN.PPERSON_ID) AND ((history_gun.gstatus_code=6) OR (history_gun.gstatus_code=9))) ORDER BY history_gun.id DESC))
Order By GUN.SERIES,GUN.NUMB;
SELECT TOP 1 history_gun.id
FROM history_gun
WHERE ( (history_gun.gun_id = gun.id) AND
(history_gun.pperson_id=" & IDfl & ") AND
(history_gun.pperson_id = gun.pperson_id) AND
((history_gun.gstatus_code=6) OR (history_gun.gstatus_code=9))
)
ORDER BY history_gun.id DESC
Rojohn писал(а):Так для интереса, остался один вопрос: неужели вложенные SELECTы так сильно тормозят запросы
(history_gun.pperson_id = gun.pperson_id) AND
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 116