2014-10-28 47 views
0

缺少的日期,我創建了下面的腳本...的Oracle SQL - 從範圍

SELECT 
    gr.RESERVATION_NO, 
    gr.TITLE, 
    gr.CATNR, 
    gl.DUEDATE, 
    gr.CRE_USR, 
    gl.QTY, 
    gl.WORK_CENTER_NO, 
    gl.TEC_CRITERIA, 
    gr.RESERVE_QTY, 
    gl.PLANT, 
    studate.dt 
FROM GPS_RESERVATION gr, 
    (Select first_date + Level-1 dt 
    From 
    (
     Select trunc(sysdate) first_date, 
     trunc(sysdate)+60 last_date 
     from dual 
    ) 
     Connect By Level <= (last_date - first_date) +1) studate 
    INNER JOIN GPS_RESERVATION_LOAD gl 
      ON gl.work_center_no = 'ALIN' 
     AND gl.duedate = studate.dt 
     AND gl.plant = 'W' 
WHERE gr.RESERVATION_NO = gl.RESERVATION_NO 
    AND gr.ACTIVE_FLAG = 'Y' 
    AND gr.reservation_no = '176601' 
ORDER BY 
    gl.DUEDATE 

我希望看到所有的日期從SYSDATE到SYSDATE + 60,但是,我只得到其中交貨期存在的日期。

我得到...

enter image description here

我的預期......

enter image description here

什麼我做錯了嗎?

感謝您的幫助。

+2

您正在使用內連接而不是左外連接。您還在混合連接樣式,這使得難以跟蹤和調試;爲什麼不在'gr'和''studate'之間使用適當的連接? – 2014-10-28 17:40:55

+0

嗨,我用了一個左外連接並得到了相同的結果。 'gr'和'studate'之間沒有連接,因爲'studate'只能連接到'gr.duedate'?致歉...我對SQL很陌生。 – SMORF 2014-10-28 17:52:13

+0

您正在進行交叉連接,但使用較舊的語法,而不是顯式的ANSI「交叉連接」語法。混合可能會影響連接順序。但即使你讓內連接成爲一個外連接,你也可以用'WHERE gr.RESERVATION_NO = gl.RESERVATION_NO'來隱式地再次進行內連接。這需要成爲外部聯接'on'子句的一部分。 – 2014-10-28 17:56:57

回答

3

您將較舊的Oracle連接語法與較新的ANSI連接語法混合在一起,這有點令人困惑,並且可能會使優化器跳閘;但主要問題是您的生成日期列表和gl表之間有內部聯接;然後在where子句中也有一個連接條件,即使您更改了連接類型,它也會將其保留爲內部連接。

沒有表結構或任何數據,我想你想:

... 
FROM (
    Select first_date + Level-1 dt 
    From 
    (
     Select trunc(sysdate) first_date, 
     trunc(sysdate)+60 last_date 
     from dual 
    ) 
    Connect By Level <= (last_date - first_date) +1 
) studate 
    CROSS JOIN GPS_RESERVATION gr 
    LEFT OUTER JOIN GPS_RESERVATION_LOAD gl 
      ON gl.work_center_no = 'ALIN' 
     AND gl.duedate = studate.dt 
     AND gl.plant = 'W' 
     AND gl.RESERVATION_NO = gr.RESERVATION_NO 
WHERE gr.ACTIVE_FLAG = 'Y' 
    AND gr.reservation_no = '176601' 
ORDER BY 
    gl.DUEDATE 

的交叉聯接給你產生的日期和gr匹配的記錄的笛卡爾乘積;所以如果您的篩選器找到5行,您將有300條來自該連接的結果。然後左外部聯接在gl中查找任何匹配的行,並在該on子句中使用與gl相關的所有篩選器/聯接條件。

你應該看看你的查詢和這個查詢的執行計劃,首先看看它們的區別,但更重要的是要檢查它是否按照你的期望並以合理和經濟高效的方式加入和過濾。並且檢查結果是否正確,當然......您可能還想看看使用左外部聯接的版本,但保留了原始的where子句,並查看使其返回到內部聯接的版本。

+0

嗨亞歷克斯...我已經通過你的腳本。它非常有意義,非常感謝解釋。 – SMORF 2014-10-29 09:38:27