避免笛卡爾積現象方式一
1 主要SQL語句
SELECT *
FROM (
SELECT row_.*,
rownum rownum_
FROM (
SELECT matnr,
maktx,
lgort,
lgobe,
charg,
labst,
meins,
matkl,
wgbez,
brgew,
mtart,
gewei,
menge AS qty,
holdQty
FROM rtl_inventory_freed ri
WHERE EXISTS
(
SELECT 'x'
FROM rtl_sys_permission_inv pi
WHERE pi.tenantCode = ri.tenantCode
AND pi.lgort = ri.lgort
AND pi.werks = ri.werks
AND pi.userID = :1
)
AND tenantCode = :2
AND werks = :3
AND vkorg = :4
AND vtweg = :5
AND datuv <= :6
AND sortf >= :7
)
row_
)
WHERE rownum_ BETWEEN 1 AND 50
2 檢視其執行
出現笛卡爾積現象
2 修改SQL語句,加/*+ ordered */
SELECT *
FROM (
SELECT row_.*,
rownum rownum_
FROM (
SELECT /*+ ordered */ matnr,
maktx,
lgort,
lgobe,
charg,
labst,
meins,
matkl,
wgbez,
brgew,
mtart,
gewei,
menge AS qty,
holdQty
FROM rtl_inventory_freed ri
WHERE EXISTS
(
SELECT 'x'
FROM rtl_sys_permission_inv pi
WHERE pi.tenantCode = ri.tenantCode
AND pi.lgort = ri.lgort
AND pi.werks = ri.werks
AND pi.userID = :1
)
AND tenantCode = :2
AND werks = :3
AND vkorg = :4
AND vtweg = :5
AND datuv <= :6
AND sortf >= :7
)
row_
)
WHERE rownum_ BETWEEN 1 AND 50
2 檢視執行計劃
注:笛卡爾積現象消失。
總結:
1 子查詢容易造成笛卡爾積現象
2 /*+ ordered */ 按在from從句中出現順序連線表