Как решить неоднозначную ошибку внешнего объединения при объединении двух наборов таблиц
У меня есть 2 набора таблиц, каждый из которых содержит заголовок и таблицу подробностей. Один из наборов является основным набором, который содержит окончательный список записей, а другой набор является дополнительным набором. Каждая таблица данных имеет поле количества. Мне нужно объединить оба набора таблиц и суммировать поле количества обоих наборов таблиц, но если в дополнительном наборе меньше записей, мне нужно показать нулевое значение с исключением самой записи. Вот запрос, который отображает данные только для соответствующих записей, мне нужно отобразить все записи из основного набора с нулевыми значениями в поле количества дополнительного набора.
SELECT LTOH.txn,
LTOH.txnno,
LTOI.itemcode,
SUM (LTOI.qty) AS SumOfqty,
SUM (BTI.qty) AS SumOfqty1
FROM ( BTH
INNER JOIN
BTI
ON BTH.hsysid = BTI.ltohsysid)
INNER JOIN
( LTOH
INNER JOIN
LTOI
ON LTOH.hsysid = LTOI.ltohsysid)
ON (BTI.itemcode = LTOI.itemcode)
AND (BTH.txnno = LTOH.txnno)
AND (BTH.txn = LTOH.txn)
GROUP BY LTOH.txn, LTOH.txnno, LTOI.itemcode
HAVING ( ( (LTOH.txn) = "ABC") AND ( (LTOH.txnno) = "1"));
2 ответа
Я получил желаемые результаты, используя метод ниже:
SELECT LTOHGROUP.txn,
LTOHGROUP.txnno,
LTOHGROUP.itemcode,
SUM (LTOHGROUP.qty) AS SumOfqty,
SUM (BTHGROUP.qty) AS SumOfqty1
FROM (SELECT LTOH.*, LTOI.*
FROM LTOH
INNER JOIN
LTOI
ON LTOH.hsysid = LTOI.ltohsysid) LTOHGROUP
LEFT JOIN
(SELECT BTH.*, BTI.*
FROM BTH
INNER JOIN
BTI
ON BTH.hsysid = BTI.ltohsysid) BTHGROUP
ON (LTOHGROUP.itemcode = BTHGROUP.itemcode)
AND (LTOHGROUP.txnno = BTHGROUP.txnno)
AND (LTOHGROUP.txn = BTHGROUP.txn)
GROUP BY LTOHGROUP.txn, LTOHGROUP.txnno, LTOHGROUP.itemcode
HAVING ( ( (LTOHGROUP.txn) = 'ABC') AND ( (LTOHGROUP.txnno) = '1'));
Измените порядок соединений так, чтобы LTOI был первым, поскольку он относится к уже определенному BTI, а LTOH - последним, поскольку он связывается с LTOI и BTI. Удалены также некоторые ненужные ().
Проще говоря, соединения должны происходить в последовательности. Если отношения определены как A ->B->C->D, то объединения должны быть определены в этом порядке. Если вы попытаетесь пойти A ->B->D ->C; вы получите синтаксис ошибки, который вы отобразили, так как движок не знает, как соединить D с A, B уже определено. Механизмы SQL обычно анализируют предложение FROM в указанном порядке. Обычно я говорю, потому что в Microsoft Access пользователь может обозначать () для обозначения порядка, в котором механизм выполняет соединения. Я не уверен, что любая корпоративная СУБД сделает это, я обычно определяю их в порядке клавиш, чтобы облегчить чтение... звучит как то, что мне нужно попробовать! Однако your () не добавляли значение в предложении from для обозначения порядка.
SELECT LTOH.txn,
LTOH.txnno,
LTOI.itemcode,
SUM (LTOI.qty) AS SumOfqty,
SUM (BTI.qty) AS SumOfqty1
FROM BTH
INNER JOIN bti
ON BTH.hsysid = BTI.ltohsysid
RIGHT JOIN ltoi
ON bti.itemcode = ltoi.itemcode
RIGHT JOIN ltoh
ON ltoh.hsysid = ltoi.ltohsysid
and bth.txnno = ltoh.txnno
and bth.txn = ltoh.txn
GROUP BY ltoh.txn, ltoh.txnno, ltoi.itemcode
HAVING LTOH.txn = "ABC"
and LTOH.txnno = "1";