Как решить неоднозначную ошибку внешнего объединения при объединении двух наборов таблиц

У меня есть 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";
Другие вопросы по тегам