2016-10-03 105 views
1

我試圖運行一個SQL語句作爲一個物化視圖,然後用一個更大的表來連接這個表。我遇到了在大表中違反項目/位置組合重複約束的問題。這裏是我的物化視圖的查詢:SQL查詢返回重複項

SELECT /*+ materialize */ CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, 
     CAN.LAST_CNCL_DTE, OL.CANCEL_ID 
FROM ORDLOC OL, 
    (SELECT COUNT(CANCEL_DATE) AS CNCL_CNT, ITEM, LOCATION, 
      MAX(CANCEL_DATE) AS LAST_CNCL_DTE 
     FROM ORDLOC 
     WHERE CANCEL_DATE between (to_date(20160123,'yyyymmdd') -60) and to_date(20160123,'yyyymmdd') 
     AND CANCEL_DATE IS NOT NULL 
     GROUP BY ITEM, LOCATION) CAN 
WHERE CAN.ITEM = OL.ITEM 
AND CAN.LOCATION = OL.LOCATION 
AND CAN.LAST_CNCL_DTE = OL.CANCEL_DATE 
GROUP BY CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, CAN.LAST_CNCL_DTE, OL.CANCEL_ID 

現在,當我獨自一人跑了嵌套查詢,我有幾百行少,運行整個查詢的時候會有幾個項目/地點連擊都是獨一無二的,但是重複的項目/位置返回數百行。

+2

ITEM和LOCATION在CAN子查詢中是唯一的,但在ORDLOC表/視圖中呢?另外,僅僅因爲你使用了物化提示並不能使它成爲「物化視圖」,這在Oracle中是非常不同的事情。此外,物化提示沒有記錄,因此不應在生產代碼中使用,除非您準備好了錯誤(我已經看到這個提示),並且功能可以在不同版本之間進行意外更改。 – Boneist

+0

感謝您的評論。正在使用物化提示來實現臨時表。不知道它是否有任何效果,因爲我相信我嘗試過,沒有提示相同的效果。 – Adil

+0

至於ordloc表,它並不包含唯一的項目/位置,但擁有唯一的「訂單號」,理想情況下,我只想在最近的取消日期中提取。 – Adil

回答

0

解決方法是使用函數max,取消CANCEL_ID以消除重複的ITEM/LOCATION。由於有一個罕見的情況,我擁有相同的ITEM,LOCATION,LAST_CNCL_DATE,但由兩個不同的CANCEL_ID。這是我使用的代碼。

SELECT CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, 
CAN.LAST_CNCL_DTE, MAX (OL.CANCEL_ID) AS CANCEL_ID 
FROM ORDLOC OL, 
    (SELECT COUNT(CANCEL_DATE) AS CNCL_CNT, ITEM, LOCATION, 
    MAX(CANCEL_DATE) AS LAST_CNCL_DTE 
    FROM ORDLOC 
    WHERE CANCEL_DATE BETWEEN (TO_DATE(20160123,'yyyymmdd') -60) AND TO_DATE(20160123,'yyyymmdd') 
    GROUP BY ITEM, LOCATION) CAN 
WHERE CAN.ITEM = OL.ITEM 
AND CAN.LOCATION = OL.LOCATION 
AND CAN.LAST_CNCL_DTE = OL.CANCEL_DATE 
GROUP BY CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, CAN.LAST_CNCL_DTE