![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с запросом, пожалуйста [Access2k]
Relaxoid © (2003-09-04 16:54:00)
Есть такой запрос:
SELECT SB.NUM AS NUM, ...
FROM
SICR_BATCH AS SB, ...
REF_KIND_IS AS RKI RIGHT JOIN REF_KIND_EL AS RKE ON RKI.ELEMENT_ID=RKE.ID
WHERE
(SB.CHANGE_TYPE=RC.ID) And
(SB.PROGRAM=RP.ID) And ...
(Запрос большой, оставил только нужные части). Но Access не понимает RIGHT JOIN. Можно как то это сделать иначе? Запрос идет через ADOQuery. Заранее спасибо.
Relaxoid (2003-09-04 17:59:00) [1]
2 Hawk2: с названиями таблиц я могу такое сделать, а вот с названиями полей, сложнее, дело в том, что я пишу не новый запрос, а изменяю существующий (из-за изменений в БД), названия полей во многих местах присутствуют в запросе, мне проще написать псевдонимы для полей, чем копатся в коде и выискивать где их надо поменять. А так я согласен.
Hawk2 (2003-09-04 17:49:00) [2]
Скажу еще такое, не по теме, но близко. Поубирай из запроса всю эту фигню типа AS Другое_Имя, запрос на 30% станет короче и понятнее. Я считаю эту конструкцию нужно применять для пояснения полей, а менять одно непонятное название на другое еще более непонятное типа REF_PHYSFORM AS RPHF нет смысла.
Relaxoid (2003-09-04 17:36:00) [3]
2 Hawk2: этого я и боюсь, думаю, может можно просто связать эти 2 таблицы как то по другому. А то у меня в запросе 15 таблиц... Если все так описывать...
P.S. Кнопку справка я нажимал, она у меня не работает.
Hawk2 (2003-09-04 17:32:00) [4]
Так нажмем на кнопку справка:
Не поддерживается выражение объединения. (Ошибка 3296)
Возможные причины:
· Результаты выполнения инструкции SQL, содержащей множественные объединения, зависят от порядка выполнения объединений. Для того чтобы указать, какое из объединений необходимо выполнить первым, следует создать отдельный запрос, в котором выполняется первое объединение, а затем включить этот запрос в инструкцию SQL.
· Инструкция ON в операции JOIN является неполной или содержит слишком много таблиц. Попробуйте включить инструкцию ON в предложение WHERE.
Вобщем есть запрос:
SELECT Products.ProdName, Products.ProdZena, Sum(Oborot.Kilkist), Sum((Products.ProdZena*Oborot.Kilkist)) AS Summa, Firms.FirmName
FROM (Products INNER JOIN Oborot ON Products.ID=Oborot.ProdID) INNER JOIN Firms ON Products.FirmID=Firms.ID
GROUP BY Products.ProdName, Products.ProdZena, Firms.FirmName;
пробую заменить:
SELECT Products.ProdName, Products.ProdZena, Sum(Oborot.Kilkist), Sum((Products.ProdZena*Oborot.Kilkist)) AS Summa, Firms.FirmName
FROM (Products INNER JOIN Oborot ON Products.ID=Oborot.ProdID) RIGHTJOIN Firms ON Products.FirmID=Firms.ID
GROUP BY Products.ProdName, Products.ProdZena, Firms.FirmName;
пишет "Не поддерживается выражение объединения".
Меняю так:
SELECT Products.ProdName, Products.ProdZena, Sum(Oborot.Kilkist), Sum((Products.ProdZena*Oborot.Kilkist)) AS Summa, Firms.FirmName
FROM (Products LEFTJOIN Oborot ON Products.ID=Oborot.ProdID) RIGHTJOIN Firms ON Products.FirmID=Firms.ID
GROUP BY Products.ProdName, Products.ProdZena, Firms.FirmName;
Работает!!! Результат конечно бред, но это просто проверка. Вывод, нужно менять логику SQL-запроса.
Relaxoid (2003-09-04 17:27:00) [5]
Сделал так
REF_KIND_IS AS RKI Right JOIN REF_KIND_EL ON,
RKI.ELEMENT_ID=REF_KIND_EL.ID
но эта таблица упоминается в where, причем не раз, ничего не изменилось.
Mike Kouzmine (2003-09-04 17:24:00) [6]
А если убрать AS RKE? Вроде выше она нигде не упоминается? (хотя от ряби в глазах мог и не заметить)
Relaxoid (2003-09-04 17:14:00) [7]
2 Hawk2: поменял, тоже самое
Relaxoid (2003-09-04 17:12:00) [8]
2 Mike Kouzmine:
легко, но он очень большой
SELECT SB.NUM AS NUM, RC.CODE AS CHANGE_TYPE, RP.CODE AS PROGRAM, RK.CODE AS
KIND, SB.ENRICHMENT AS ENRICHMENT, BN.BATCHNAME AS BATCHNAME, RPHF.CODE AS
PHYS, RCF.CODE AS CHEM, RPF.CODE AS PURE, SB.LIG_MASS_UNIT AS LIG_MASS_UNIT,
SB.LIG_MASS AS LIG_MASS, RE.CODE, BE.UNIT, BE.MASS, RI.CODE, BI.UNIT, BI.MASS
FROM SICR_BATCH AS SB, BATCH_EL AS BE, Ref_Change AS RC, REF_PROGRAM AS RP,
REF_KIND AS RK, BATCHNAME AS BN, MAT_DEF_CODE AS MDC, REF_PHYSFORM AS RPHF,
REF_CHEMFORM AS RCF, REF_PURFORM AS RPF, REF_ELEMENT AS RE, REF_ISOTOPE AS RI,
BATCH_IS AS BI,
REF_KIND_IS AS RKI Right JOIN REF_KIND_EL AS RKE ON
RKI.ELEMENT_ID=RKE.ID
WHERE
(SB.CHANGE_TYPE=RC.ID) And
(SB.PROGRAM=RP.ID) And
(SB.KIND=RK.ID) And
(SB.BATCHNAME_ID=BN.ID) And
(SB.MDC_ID=MDC.ID) And
(MDC.PHYS=RPHF.ID) And
(MDC.CHEM=RCF.ID) And
(MDC.PURE=RPF.ID) And
(RKE.KIND_ID=RK.ID) And
(RKE.CODE_ID=RE.ID) And
(RKI.CODE_ID=RI.ID) And
(BE.ID=BI.EL_ID) And
(BE.BATCH_ID=SB.ID) And
(BE.EL_ID=RKE.ID) And
(BI.IS_ID=RKI.ID) And
BE.REPORT_TYPE=2 And SB.REP_ID=:repid
ORDER BY SB.NUM, RK.CODE, RE.CODE;
Hawk2 (2003-09-04 17:12:00) [9]
left join работает, правда я пробовал только в Access97. Если можно в запросе поменять местами RKI.ELEMENT_ID=RKE.ID (RKE.ID=RKI.ELEMENT_ID) и использовать left join.
A_N_D (2003-09-04 17:10:00) [10]
Значит не в этом join"е ошибка
Mike Kouzmine (2003-09-04 17:10:00) [11]
Все-таки может имеет смысл весь запрос показать?
Relaxoid (2003-09-04 17:09:00) [12]
2 Mike Kouzmine:
Чего то я непонял, как это применить к моему запросу?
Relaxoid (2003-09-04 17:07:00) [13]
left join аналогично с right join
A_N_D (2003-09-04 17:04:00) [14]
left join
Relaxoid (2003-09-04 17:02:00) [15]
Просто join мне не катит, в таближе RKI может не быть ссылки на RKE, а может и быть.
Relaxoid (2003-09-04 17:01:00) [16]
Не знаю, пишет "Не поддерживается выражение объеденения".
Mike Kouzmine (2003-09-04 17:01:00) [17]
UPDATE SCHET LEFT JOIN AGENTS ON SCHET.AGENTCODE = AGENTS.AGENTCODE SET SCHET.OCENA = [SCHET]![OCENA]*0.69
WHERE (((SCHET.SCLAD)="000002") AND ((SCHET.VID)=2) AND ((SCHET.TYPE)=5) AND ((SCHET.AGENTCODE)=138) AND ((SCHET.NUMDOC) Is Null));
Нормально катит
A_N_D (2003-09-04 17:01:00) [18]
просто join
Mike Kouzmine (2003-09-04 17:00:00) [19]
Почему не понимает?