我在查詢中使用了三個表;AP_INVOICES_INTERFACE, AP_INVOICE_LINES_INTERFACE, 和PO_HEADERS_ALL作為子查詢。
AP_INVOICE_LINES_INTERFACE 表僅在PO_NUMBER從 AP_INVOICE_LINES_INTERFACE 到PO_HEADERS_ALL 時連接到SEGMENT1PO_HEADERS_ALL。我想根據不SEGMENT1相等的LN.PO_NUMBER地方用 REQ_BU_ID 值填充“REQ_BU_ID2”列NULL。
SELECT HDR.INVOICE_ID , HDR.PO_NUMBER , LN.PO_NUMBER LN_PO_NUMBER
, (SELECT PO2.REQ_BU_ID
FROM PO_HEADERS_ALL PO2
WHERE PO2.SEGMENT1 = LN.PO_NUMBER
AND PO2.REQ_BU_ID IS NOT NULL
AND LN.PO_NUMBER IS NOT NULL
--AND HDR.PO_NUMBER IS NOT NULL
AND rownum = 1 ) REQ_BU_ID2
FROM AP_INVOICES_INTERFACE HDR
INNER JOIN AP_INVOICE_LINES_INTERFACE LN ON LN.INVOICE_ID = HDR.INVOICE_ID
AND HDR.INVOICE_ID = 300000136747640
我想填充行的REQ_BU_ID2(非空)值,即使LN.PO_NUMBER是NULL這樣我認為通過使用AND LN.PO_NUMBER IS NOT NULL子查詢中的條件然后只會回傳非空值,但是正如您所看到的那樣,它仍在Null回傳結果:
上述查詢的當前結果:

期望的結果:

編輯:
INVOICE_ID REQ_BU_ID2 PO_NUMBER LN_PO_NUMBER
300000136747640 300000006290049 K11004499
300000136747640
300000136747640
300000136747640 300000006290049 K11004499
uj5u.com熱心網友回復:
下面使用 CTE 使所有INVOICE_IDs 相同LN_PO_NUMBER。
如果他們可以合法地擁有不同的“非 NULL” PO_NUMBER,這將行不通。
然后,您的子查詢已被調整使用ORDER BY REQ_BU_ID DESC FETCH NEXT 1 ROWS ONLY,以便以REQ_BU_ID一種確定性的方式準確地找到一個,更喜歡非 NULL 值。
同樣,如果 anyPO_NUMBER可以合法地與超過 1 個 non-NULL 相關REQ_BU_ID,這將不起作用。
此外,如果找到零REQ_BU_ID,它仍會回傳NULL.
WITH
PO_LOOKUP
AS
(
SELECT
HDR.INVOICE_ID,
HDR.PO_NUMBER,
MAX(LN.PO_NUMBER) OVER (PARTITION BY HDR.INVOICE_ID) AS LN_PO_NUMBER
FROM
AP_INVOICES_INTERFACE HDR
INNER JOIN
AP_INVOICE_LINES_INTERFACE LN
ON LN.INVOICE_ID = HDR.INVOICE_ID
)
SELECT
PO_LOOKUP.*,
(
SELECT REQ_BU_ID
FROM PO_HEADERS_ALL
WHERE SEGMENT1 = PO_LOOKUP.LN_PO_NUMBER
ORDER BY REQ_BU_ID ASC
FETCH NEXT 1 ROWS ONLY
)
AS REQ_BU_ID
FROM
PO_LOOKUP
WHERE
INVOICE_ID = 300000136747640
演示:https ://dbfiddle.uk/N9fb6W9I
編輯:或者...
SELECT
HDR.INVOICE_ID,
HDR.PO_NUMBER,
LN.MAX_PO_NUMBER,
PO.MAX_REQ_BU_ID
FROM
AP_INVOICES_INTERFACE HDR
INNER JOIN
(
SELECT
AP_INVOICE_LINES_INTERFACE.*,
MAX(PO_NUMBER) OVER (PARTITION BY INVOICE_ID) AS MAX_PO_NUMBER
FROM
AP_INVOICE_LINES_INTERFACE
)
LN
ON LN.INVOICE_ID = HDR.INVOICE_ID
INNER JOIN
(
SELECT
SEGMENT1,
MAX(REQ_BU_ID) AS MAX_REQ_BU_ID
FROM
PO_HEADERS_ALL
GROUP BY
SEGMENT1
)
PO
ON PO.SEGMENT1 = LN.MAX_PO_NUMBER
WHERE
HDR.INVOICE_ID = 300000136747640
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536650.html
標籤:数据库甲骨文
