Oracle SQL - оператор IF / CASE для выбора конкретного внутреннего соединения - PullRequest
0 голосов
/ 25 апреля 2018

Вот мой SQL

SELECT DISTINCT
   AID.INVOICE_ID,
   AID.AMOUNT,
   AID.PERIOD_NAME,
   GCC.SEGMENT1 as Organisation,
   GCC.SEGMENT2,
   GCC.SEGMENT3,
   GCC.SEGMENT4,
   INV.INVOICE_NUM,
   INV.CREATION_DATE,
   PO.SEGMENT1 as PO_Number,
   SUP.VENDOR_NAME,
   AID.LINE_TYPE_LOOKUP_CODE,
   LINES.LINE_NUMBER
FROM
   AP_INVOICES_All INV 
   INNER JOIN
      AP_INVOICE_LINES_ALL LINES 
      ON INV.INVOICE_ID = LINES.INVOICE_ID 
   INNER JOIN
      AP_INVOICE_DISTRIBUTIONS_ALL AID 
      ON INV.INVOICE_ID = AID.INVOICE_ID 
   INNER JOIN
      GL_CODE_COMBINATIONS GCC 
      ON AID.DIST_CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID 
   INNER JOIN
      POZ_SUPPLIERS_V SUP 
      ON INV.VENDOR_ID = SUP.VENDOR_ID 
   LEFT JOIN
      PO_HEADERS_ALL PO 
      ON LINES.PO_HEADER_ID = PO.PO_HEADER_ID 
   LEFT JOIN
      PO_DISTRIBUTIONS_ALL PDA 
      ON INV.INVOICE_ID = PDA.PO_DISTRIBUTIONS_ALL 
WHERE
   AID.LINE_TYPE_LOOKUP_CODE NOT IN 
   (
      'REC_TAX',
      'NONREC_TAX'
   )
   AND LINES.LINE_TYPE_LOOKUP_CODE NOT IN 
   (
      'TAX'
   )

END


ORDER BY
   AID.INVOICE_ID,
   LINES.LINE_NUMBER

Я смотрю на что-то похожее на ниже.Я хочу сказать, что если PO.SEGMENT имеет значение null, то выберите столбцы из таблицы, используя указанное соединение.Используйте разные столбцы в соединении в зависимости от того, является ли PO.SEGMENT нулевым или нет.Это легко достижимо?

CASE 

WHEN PO.SEGMENT IS NOT NULL 
THEN SEGMENT1,SEGMENT2,SEGMENT3,SEGMENT4 
FROM GCC.CODE_COMBINATION_ID 
WHERE PDA.CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID

WHEN PO.SEGMENT IS NULL 
THEN SEGMENT1,SEGMENT2,SEGMENT3,SEGMENT4 
FROM GCC.CODE_COMBINATION_ID 
WHERE AID.DIST_CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID

END 

1 Ответ

0 голосов
/ 25 апреля 2018

Как насчет перефразирования вашей логики, чтобы у вас было только одно предложение ON:

ON
    (PO.SEGMENT IS NOT NULL AND PDA.CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID) OR
    (PO.SEGMENT IS NULL AND AID.DIST_CODE_COMBINATION_ID = GCC.CODE_COMBINATION_ID)

Я пропустил другие детали остальной части вашего запроса, но я предлагаю это, потому что это может бытьможно добиться того, что вы хотите с осторожной логикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...