Oracle

多個自連接,其中連接條件並不總是存在

  • October 7, 2020

我正在嘗試執行多重自聯接查詢,其中它加入的條件之一併不總是存在。我有一個儲存不同銷售事件的表,其中單個交易 (sale_id) 可以有多個與之關聯的銷售事件 - 例如,銷售 ID 為 123 的交易有四行銷售 ID 為 123 和銷售類型 SALE_PROPOSED、SALE_ACCEPTED、SALE_DONE、SALE_EXCEPTION。

我正在嘗試編寫一個查詢,該查詢根據 sale_id 連接所有銷售類型,並從中選擇相關資訊到單個結果行中。到目前為止,我得到了:

WITH SALES_TODAY AS(
SELECT *
FROM SALES
WHERE ..//date range logic for getting sales for the day)
SELECT SALE_PROPOSED.sale_id, SALE_PROPOSED.customer_id, SALE_ACCEPTED.price,
      SALE_ACCEPTED.accepted_date, SALE_DONE.done_date, SALE_EXCEPTION.exception_description
FROM SALES_TODAY SALE_PROPOSED, SALES_TODAY SALE_ACCEPTED, 
    SALES_TODAY SALE_DONE, SALES_TODAY SALE_EXCEPTION
WHERE (SALE_PROPOSED.sale_type='SALE_PROPOSED')
AND (SALE_PROPOSED.sale_id=SALE_ACCEPTED.sale_id AND SALE_ACCEPTED.sale_type='SALE_ACCEPTED')
AND (SALE_PROPOSED.sale_id=SALE_DONE.sale_id AND SALE_DONE.sale_type='SALE_DONE')
AND (SALE_EXCEPTION.SALE_TYPE='SALE_EXCEPTION');

範例表摘錄

sale_id |    sale_type    | ....// other columns
------------------------------------------
123     | SALE_PROPOSED
123     | SALE_ACCEPTED
123     | SALE_DONE
123     | SALE_EXCEPTION
456     | SALE_PROPOSED
456     | SALE_ACCEPTED
456     | SALE_DONE

雖然它適用於具有所有 4 個事件的銷售,但它為沒有關聯的 sale_type ‘SALE_EXCEPTION’ 類型的銷售返回 0 行。我還嘗試使用左連接重構此 SQL 以加入“SALE_EXCEPTION”,但它返回了與銷售類型“SALE_EXCEPTION”相關聯的銷售的重複項,同時在沒有此類事件的情況下可以正常工作。任何人都可以建議我的查詢缺少什麼,以便無論 sales_id 是否具有 sale_type ‘SALE_EXCEPTION’,它都會返回正確的結果。謝謝你。

您使用 INNER JOIN(以逗號分隔的表名形式),而您必須使用 LEFT JOIN。

WITH SALES_TODAY AS( /* daily selection logic */ ),

    sale_id_list AS ( SELECT DISTINCT sale_id FROM SALES_TODAY )

SELECT sale_id_list.sale_id, ...
FROM sale_id_list 
LEFT JOIN SALES_TODAY AS SALE_PROPOSED 
   ON SALE_PROPOSED.sale_id=sale_id_list.sale_id
   AND SALE_PROPOSED.sale_type='SALE_PROPOSED'
LEFT JOIN SALES_TODAY AS SALE_ACCEPTED
   ON SALE_ACCEPTED.sale_id=sale_id_list.sale_id
   AND SALE_ACCEPTED.sale_type='SALE_ACCEPTED'
LEFT JOIN ...

引用自:https://dba.stackexchange.com/questions/276699