Oracle
多個自連接,其中連接條件並不總是存在
我正在嘗試執行多重自聯接查詢,其中它加入的條件之一併不總是存在。我有一個儲存不同銷售事件的表,其中單個交易 (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 ...