Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
ВнизПомогите с запросом, пожалуйста Найти похожие ветки
← →
Relaxoid (2003-09-04 16:54) [0]Есть такой запрос:
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. Заранее спасибо.
← →
Mike Kouzmine (2003-09-04 17:00) [1]Почему не понимает?
← →
A_N_D (2003-09-04 17:01) [2]просто join
← →
Mike Kouzmine (2003-09-04 17:01) [3]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));
Нормально катит
← →
Relaxoid (2003-09-04 17:01) [4]Не знаю, пишет "Не поддерживается выражение объеденения".
← →
Relaxoid (2003-09-04 17:02) [5]Просто join мне не катит, в таближе RKI может не быть ссылки на RKE, а может и быть.
← →
A_N_D (2003-09-04 17:04) [6]left join
← →
Relaxoid (2003-09-04 17:07) [7]left join аналогично с right join
← →
Relaxoid (2003-09-04 17:09) [8]2 Mike Kouzmine:
Чего то я непонял, как это применить к моему запросу?
← →
Mike Kouzmine (2003-09-04 17:10) [9]Все-таки может имеет смысл весь запрос показать?
← →
A_N_D (2003-09-04 17:10) [10]Значит не в этом join"е ошибка
← →
Hawk2 (2003-09-04 17:12) [11]left join работает, правда я пробовал только в Access97. Если можно в запросе поменять местами RKI.ELEMENT_ID=RKE.ID (RKE.ID=RKI.ELEMENT_ID) и использовать left join.
← →
Relaxoid (2003-09-04 17:12) [12]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;
← →
Relaxoid (2003-09-04 17:14) [13]2 Hawk2: поменял, тоже самое
← →
Mike Kouzmine (2003-09-04 17:24) [14]А если убрать AS RKE? Вроде выше она нигде не упоминается? (хотя от ряби в глазах мог и не заметить)
← →
Relaxoid (2003-09-04 17:27) [15]Сделал так
REF_KIND_IS AS RKI Right JOIN REF_KIND_EL ON
,
RKI.ELEMENT_ID=REF_KIND_EL.ID
но эта таблица упоминается в where, причем не раз, ничего не изменилось.
← →
Hawk2 (2003-09-04 17:32) [16]Так нажмем на кнопку справка:
Не поддерживается выражение объединения. (Ошибка 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) RIGHT 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 LEFT JOIN Oborot ON Products.ID=Oborot.ProdID) RIGHT JOIN Firms ON Products.FirmID=Firms.ID
GROUP BY Products.ProdName, Products.ProdZena, Firms.FirmName;
Работает!!! Результат конечно бред, но это просто проверка. Вывод, нужно менять логику SQL-запроса.
← →
Relaxoid (2003-09-04 17:36) [17]2 Hawk2: этого я и боюсь, думаю, может можно просто связать эти 2 таблицы как то по другому. А то у меня в запросе 15 таблиц... Если все так описывать...
P.S. Кнопку справка я нажимал, она у меня не работает.
← →
Hawk2 (2003-09-04 17:49) [18]Скажу еще такое, не по теме, но близко. Поубирай из запроса всю эту фигню типа AS Другое_Имя, запрос на 30% станет короче и понятнее. Я считаю эту конструкцию нужно применять для пояснения полей, а менять одно непонятное название на другое еще более непонятное типа REF_PHYSFORM AS RPHF нет смысла.
← →
Relaxoid (2003-09-04 17:59) [19]2 Hawk2: с названиями таблиц я могу такое сделать, а вот с названиями полей, сложнее, дело в том, что я пишу не новый запрос, а изменяю существующий (из-за изменений в БД), названия полей во многих местах присутствуют в запросе, мне проще написать псевдонимы для полей, чем копатся в коде и выискивать где их надо поменять. А так я согласен.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c