Phần này có thể gây ra sự cố:
FROM BOM_CHILDS C
, XX_MAIN.XX_MAST MAST
, XX_MAIN.XX_STPO STPO
WHERE C.MATNR = MAST.MATNR(+)
AND MAST.STLNR = STPO.STLNR(+)
AND MAST.STLAN(+) = '1'
AND MAST.WERKS(+) = C.WERKS
AND STPO.IDNRK IS NULL
Để làm cho việc này dễ dàng hơn một chút, hãy sắp xếp lại WHERE
mệnh đề sắp xếp thứ tự các bảng theo cách chúng liên quan:
FROM BOM_CHILDS C
, XX_MAIN.XX_MAST MAST
, XX_MAIN.XX_STPO STPO
-- Joining C to MAST
WHERE C.MATNR = MAST.MATNR(+)
AND C.WERKS = MAST.WERKS(+)
AND MAST.STLAN(+) = '1'
-- Joining MAST to STPO
AND MAST.STLNR = STPO.STLNR(+)
AND STPO.IDNRK IS NULL
Chúng tôi có C
đã tham gia vào MAST
sử dụng C
làm bảng "trình điều khiển" và lấy dữ liệu từ MAST
nơi nó khớp (một kết hợp bên trái):
FROM BOM_CHILDS C
LEFT JOIN XX_MAIN.XX_MAST MAST
ON C.MANTR = MAST.MANTR
AND C.WERKS = MAST.WERKS
AND MAST.STLAN = '1'
Sau đó, chúng ta cần thêm STPO
đến các tham gia:
LEFT JOIN XX_MAIN.XX_STPO STPO
ON MAST.STLNR = STPO.STLNR
AND STPO.IDNRK IS NULL
Tổng hợp tất cả lại với nhau, chúng tôi nhận được:
FROM BOM_CHILDS C
LEFT JOIN XX_MAIN.XX_MAST MAST
ON C.MANTR = MAST.MANTR
AND C.WERKS = MAST.WERKS
AND MAST.STLAN = '1'
LEFT JOIN XX_MAIN.XX_STPO STPO
ON MAST.STLNR = STPO.STLNR
AND STPO.IDNRK IS NULL
Điều đó nói rằng , mặc dù (+)
hoạt động cho các phép nối trái / phải / ngoài, Oracle khuyến nghị không sử dụng nó
: