Oracle SQL-IF/CASE语句选择特定的内部联接
这是我的SQLOracle SQL-IF/CASE语句选择特定的内部联接,sql,oracle,Sql,Oracle,这是我的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_NAM
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是否为null,在联接中使用不同的列。这容易实现吗
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
如何重新表述您的逻辑,使您只需要一个ON子句:
我省略了查询其余部分的其他细节,但我建议这样做,因为通过仔细的逻辑可以实现您想要的结果。这是一个很好的方法,不过我要补充的是,整个ON语句需要用括号括起来,否则您可能会留下一个OR语句,这将导致笛卡尔积。
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)