Многоэлементный идентификатор не может быть привязан к левому внешнему соединению - PullRequest
0 голосов
/ 02 января 2019

У меня следующий запрос, который я пытаюсь добавить условие в левое внешнее соединение, однако таблица с псевдонимами (B) дает ошибку, потому что она не может быть связана.

Если я добавлю условие в критерии WHERE, оно работает, однако я считаю, что это фильтрует больше строк, чем я хочу, поэтому я действительно хочу включить его во внешнее объединение.

SELECT  A.BUSINESS_UNIT, D.DESCR, 
(CONVERT(CHAR(10),A.PO_DT,121)), A.PO_ID, A.VENDOR_ID,
 B.LINE_NBR, B.INV_ITEM_ID, E.DESCR, B.ITM_ID_VNDR, B.CATEGORY_ID, B.UNIT_OF_MEASURE,
 B.MFG_ID, B.MFG_ITM_ID, C.MERCHANDISE_AMT, C.QTY_PO, C.MERCH_AMT_BSE, C.ACCOUNT,
 E.CATEGORY_ID, F.DESCR60, E.ITEM_FIELD_C10_A, E.ITEM_FIELD_C10_B, H.INVOICE_ID, H.INVOICE_DT, H.VOUCHER_ID
  FROM  PS_PO_HDR A 

  LEFT OUTER JOIN PS_VOUCHER_LINE G ON A.PO_ID = G.PO_ID AND A.BUSINESS_UNIT = G.BUSINESS_UNIT AND G.LINE_NBR = B.LINE_NBR
  LEFT OUTER JOIN PS_VOUCHER H ON G.VOUCHER_ID = H.VOUCHER_ID AND G.BUSINESS_UNIT = H.BUSINESS_UNIT

  ,PS_PO_LINE B, PS_PO_LINE_DISTRIB C, PS_BUS_UNIT_TBL_FS D,
  (PS_MASTER_ITEM_TBL E 

   LEFT OUTER JOIN  PS_ITM_CAT_TBL F ON  E.SETID = F.SETID AND F.CATEGORY_ID = E.CATEGORY_ID )


    WHERE ( A.BUSINESS_UNIT = B.BUSINESS_UNIT 
     AND A.PO_ID = B.PO_ID 
     AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
     AND B.PO_ID = C.PO_ID 
     AND B.LINE_NBR = C.LINE_NBR 
     AND A.PO_DT BETWEEN '2018-12-05' AND '2018-12-12' 
     AND A.BUSINESS_UNIT = D.BUSINESS_UNIT 
     AND E.INV_ITEM_ID = B.INV_ITEM_ID 
     AND F.EFFDT = 
        (SELECT MAX(F_ED.EFFDT) FROM PS_ITM_CAT_TBL F_ED 
        WHERE F.SETID = F_ED.SETID 
          AND F.CATEGORY_TYPE = F_ED.CATEGORY_TYPE 
          AND F.CATEGORY_CD = F_ED.CATEGORY_CD 
          AND F.CATEGORY_ID = F_ED.CATEGORY_ID 
          AND F_ED.EFFDT <= SUBSTRING(CONVERT(CHAR,GETDATE(),121), 1, 10)))

LEFT OUTER JOIN PS_VOUCHER_LINE G ON A.PO_ID = G.PO_ID AND A.BUSINESS_UNIT = G.BUSINESS_UNIT **AND G.LINE_NBR = B.LINE_NBR**

Ошибка:

Не удалось связать многокомпонентный идентификатор "B.LINE_NBR".

Я считаю, что это происходит, потому что таблица PS_PO_LINE B не являетсяобъявлено до этого присоединиться.Если я переместу объединение так, чтобы оно находилось внизу раздела FROM, я получу связанные ошибки на PS_PO_HDR A и все еще PS_PO_LINE B, поэтому я не уверен, что могу сделать, чтобы избежать использования критериев в разделе WHERE.Спасибо за помощь!

1 Ответ

0 голосов
/ 02 января 2019

Проблема в том, что вы смешиваете синтаксисы соединения. Не используйте соединения старого стиля.

Если вы переформатируете свой код, вы увидите свою проблему.

SELECT
   A.BUSINESS_UNIT,
   D.DESCR,
   (
      CONVERT(CHAR(10), A.PO_DT, 121)
   ),
   A.PO_ID,
   A.VENDOR_ID,
   B.LINE_NBR,      
   B.INV_ITEM_ID,
   E.DESCR,
   B.ITM_ID_VNDR,
   B.CATEGORY_ID,
   B.UNIT_OF_MEASURE,
   B.MFG_ID,
   B.MFG_ITM_ID,
   C.MERCHANDISE_AMT,
   C.QTY_PO,
   C.MERCH_AMT_BSE,
   C.ACCOUNT,
   E.CATEGORY_ID,
   F.DESCR60,
   E.ITEM_FIELD_C10_A,
   E.ITEM_FIELD_C10_B,
   H.INVOICE_ID,
   H.INVOICE_DT,
   H.VOUCHER_ID 
FROM
   PS_PO_HDR A 
   LEFT OUTER JOIN
      PS_VOUCHER_LINE G 
      ON A.PO_ID = G.PO_ID 
      AND A.BUSINESS_UNIT = G.BUSINESS_UNIT 
      AND G.LINE_NBR = B.LINE_NBR 
   LEFT OUTER JOIN
      PS_VOUCHER H 
      ON G.VOUCHER_ID = H.VOUCHER_ID 
      AND G.BUSINESS_UNIT = H.BUSINESS_UNIT,
      PS_PO_LINE B,
      PS_PO_LINE_DISTRIB C,
      PS_BUS_UNIT_TBL_FS D,
      (
         PS_MASTER_ITEM_TBL E 
         LEFT OUTER JOIN
            PS_ITM_CAT_TBL F 
            ON E.SETID = F.SETID 
            AND F.CATEGORY_ID = E.CATEGORY_ID 
      )
WHERE
   (
      A.BUSINESS_UNIT = B.BUSINESS_UNIT 
      AND A.PO_ID = B.PO_ID 
      AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
      AND B.PO_ID = C.PO_ID 
      AND B.LINE_NBR = C.LINE_NBR 
      AND A.PO_DT BETWEEN '2018-12-05' AND '2018-12-12' 
      AND A.BUSINESS_UNIT = D.BUSINESS_UNIT 
      AND E.INV_ITEM_ID = B.INV_ITEM_ID 
      AND F.EFFDT = 
      (
         SELECT
            MAX(F_ED.EFFDT) 
         FROM
            PS_ITM_CAT_TBL F_ED 
         WHERE
            F.SETID = F_ED.SETID 
            AND F.CATEGORY_TYPE = F_ED.CATEGORY_TYPE 
            AND F.CATEGORY_CD = F_ED.CATEGORY_CD 
            AND F.CATEGORY_ID = F_ED.CATEGORY_ID 
            AND F_ED.EFFDT <= SUBSTRING(CONVERT(CHAR, GETDATE(), 121), 1, 10)
      )
   )
   LEFT OUTER JOIN
      PS_VOUCHER_LINE G 
      ON A.PO_ID = G.PO_ID 
      AND A.BUSINESS_UNIT = G.BUSINESS_UNIT **
      AND G.LINE_NBR = B.LINE_NBR*

В самом низу вашего кода:

   LEFT OUTER JOIN
      PS_VOUCHER_LINE G 
      ON A.PO_ID = G.PO_ID 
      AND A.BUSINESS_UNIT = G.BUSINESS_UNIT **
      AND G.LINE_NBR = B.LINE_NBR*

Предполагая, что * на самом деле отсутствует в вашем коде (причина, которая также может вызвать проблемы), операторы JOIN идут перед предложением WHERE. Это после предложения WHERE. Вы должны переместить его.

После изменения всего на явный синтаксис объединения и удаления некоторых фиктивных запятых и ненужных скобок, вот пример того, что вы хотите. Просто проверьте пункты JOIN, где у меня есть комментарии.

SELECT
   A.BUSINESS_UNIT,
   D.DESCR,
   (
      CONVERT(CHAR(10), A.PO_DT, 121)
   ),
   A.PO_ID,
   A.VENDOR_ID,
   B.LINE_NBR,      
   B.INV_ITEM_ID,
   E.DESCR,
   B.ITM_ID_VNDR,
   B.CATEGORY_ID,
   B.UNIT_OF_MEASURE,
   B.MFG_ID,
   B.MFG_ITM_ID,
   C.MERCHANDISE_AMT,
   C.QTY_PO,
   C.MERCH_AMT_BSE,
   C.ACCOUNT,
   E.CATEGORY_ID,
   F.DESCR60,
   E.ITEM_FIELD_C10_A,
   E.ITEM_FIELD_C10_B,
   H.INVOICE_ID,
   H.INVOICE_DT,
   H.VOUCHER_ID 
FROM
   PS_PO_HDR A 
    LEFT OUTER JOIN
      PS_VOUCHER_LINE G 
      ON A.PO_ID = G.PO_ID 
      AND A.BUSINESS_UNIT = G.BUSINESS_UNIT 
      AND G.LINE_NBR = B.LINE_NBR 
    LEFT OUTER JOIN
      PS_VOUCHER H 
      ON G.VOUCHER_ID = H.VOUCHER_ID 
      AND G.BUSINESS_UNIT = H.BUSINESS_UNIT

    /*BEGIN code taken from where clause */
    LEFT OUTER JOIN
      PS_PO_LINE B  
      ON A.BUSINESS_UNIT = B.BUSINESS_UNIT 
      AND A.PO_ID = B.PO_ID 
    LEFT OUTER JOIN
      PS_PO_LINE_DISTRIB C
      ON B.BUSINESS_UNIT = C.BUSINESS_UNIT 
      AND B.PO_ID = C.PO_ID 
      AND B.LINE_NBR = C.LINE_NBR 
    LEFT OUTER JOIN
      PS_BUS_UNIT_TBL_FS D
      ON A.BUSINESS_UNIT = D.BUSINESS_UNIT 
    LEFT OUTER JOIN
      PS_MASTER_ITEM_TBL E
      ON  E.INV_ITEM_ID = B.INV_ITEM_ID 
      /*END code taken from where clause */

    LEFT OUTER JOIN
      PS_ITM_CAT_TBL F 
      ON E.SETID = F.SETID 
      AND F.CATEGORY_ID = E.CATEGORY_ID 
    LEFT OUTER JOIN
      PS_VOUCHER_LINE G 
      ON A.PO_ID = G.PO_ID 
      AND A.BUSINESS_UNIT = G.BUSINESS_UNIT 
      AND G.LINE_NBR = B.LINE_NBR
WHERE

      A.PO_DT BETWEEN '2018-12-05' AND '2018-12-12' 
      AND F.EFFDT = 
      (
         SELECT
            MAX(F_ED.EFFDT) 
         FROM
            PS_ITM_CAT_TBL F_ED 
         WHERE
            F.SETID = F_ED.SETID 
            AND F.CATEGORY_TYPE = F_ED.CATEGORY_TYPE 
            AND F.CATEGORY_CD = F_ED.CATEGORY_CD 
            AND F.CATEGORY_ID = F_ED.CATEGORY_ID 
            AND F_ED.EFFDT <= SUBSTRING(CONVERT(CHAR, GETDATE(), 121), 1, 10)
      )
...