2012-06-03 20 views
0

我有這個查詢的一個問題:LEFT OUTER JOIN產生不正確的語法

SELECT  RTRIM(LTRIM(L_MAILITMS.MAILITM_FID)) AS Ref30 
     , IsNull (Ref33,0) as Ref33 
FROM  L_MAILITM_EVENTS 
    INNER JOIN L_MAILITMS ON L_MAILITM_EVENTS.MAILITM_PID = L_MAILITMS.MAILITM_PID 
WHERE (L_MAILITMS.MAIL_CLASS_CD = 'E') 
    AND (L_MAILITM_EVENTS.EVENT_OFFICE_CD = 1063) 
    AND (L_MAILITM_EVENTS.EVENT_TYPE_CD = 30) 
    AND (L_MAILITM_EVENTS.EVENT_GMT_DT >= CONVERT(DATETIME, '2012-05-27 00:00:00', 102)) 
    AND (L_MAILITM_EVENTS.EVENT_GMT_DT < CONVERT(DATETIME, '2012-05-28 00:00:00', 102)) 
LEFT OUTER JOIN 
    (
    SELECT RTRIM(LTRIM(L_MAILITMS_1.MAILITM_FID)) as Ref3033 
      , COUNT(*) as Ref33 
    FROM  L_MAILITM_EVENTS as L_MAILITM_EVENTS_1 
     INNER JOIN L_MAILITMS as L_MAILITMS_1 ON L_MAILITM_EVENTS_1.MAILITM_PID = L_MAILITMS_1.MAILITM_PID 
    WHERE (L_MAILITMS_1.MAIL_CLASS_CD = 'E') 
     AND (L_MAILITM_EVENTS_1.EVENT_OFFICE_CD = 1063) 
     AND (L_MAILITM_EVENTS_1.EVENT_TYPE_CD = 33) 
     AND (L_MAILITM_EVENTS_1.EVENT_GMT_DT >= CONVERT(DATETIME, '2012-05-27 00:00:00', 102)) 
    GROUP BY L_MAILITMS_1.MAILITM_FID 
) ON L_MAILITMS.MAILITM_FID = L_MAILITMS_1.MAILITM_FID 

產生一個錯誤

消息156,級別15,狀態1,行7
附近有語法錯誤關鍵字「LEFT」。
Msg 156,Level 15,State 1,Line 16
關鍵字'ON'附近的語法不正確。

表L_MAILITMS_EVENTS:

MAILITM_PID  EVENT_OFFICE_CD EVENT_TYPE_CD 
----------------------------------------------------------- 
1    1063    30 
2    1063    30 
2    1063    33 
3    1063    33 
3    1063    30 
4    1063    30 

表L_MAILITMS:

MAILITM_PID   MAILITM_FID  MAIL_CLASS_CD 
------------------------------------------------------- 
1      123    E 
2      452    E     
3      369    E 
4      633    E 

我想什麼:

Ref30   Ref33 
----------------------- 
123   0 
452   1 
369   1 
633   0 

UPDATE:感謝Sebas你[R幫助

*有另一種方式爲這個查詢,以保證速度的表現,因爲我把約2500 MAILITM_FID?*

誰能幫助? 謝謝

+3

'JOINs'是'FROM'的子條款,它們不能出現在'WHERE'之後 –

+1

您想要做什麼? –

回答

0

然後讓我修改放置的加入:

SELECT  RTRIM(LTRIM(m.MAILITM_FID)) AS Ref30 
     , IsNull (Ref33,0) as Ref33 
FROM  L_MAILITM_EVENTS me 
    INNER JOIN L_MAILITMS m ON me.MAILITM_PID = m.MAILITM_PID 
    LEFT OUTER JOIN (
      SELECT RTRIM(LTRIM(m1.MAILITM_FID)) as Ref3033 
        , COUNT(*) as Ref33 
      FROM  L_MAILITM_EVENTS me1 
         INNER JOIN L_MAILITMS m1 ON me1.MAILITM_PID = m1.MAILITM_PID 
      WHERE (m1.MAIL_CLASS_CD = 'E') 
       AND (me1.EVENT_OFFICE_CD = 1063) 
       AND (me1.EVENT_TYPE_CD = 33) 
       AND (me1.EVENT_GMT_DT >= CONVERT(DATETIME, '2012-05-27 00:00:00', 102)) 
      GROUP BY m1.MAILITM_FID 
) oj ON m.MAILITM_FID = oj.Ref3033 
WHERE (m.MAIL_CLASS_CD = 'E') 
    AND (me.EVENT_OFFICE_CD = 1063) 
    AND (me.EVENT_TYPE_CD = 30) 
    AND (me.EVENT_GMT_DT >= CONVERT(DATETIME, '2012-05-27 00:00:00', 102)) 
    AND (me.EVENT_GMT_DT < CONVERT(DATETIME, '2012-05-28 00:00:00', 102)) 

我沒有檢查你的加入邏輯,我只是​​感動他們。嘗試看看是否仍然存在此語法錯誤..

+0

感謝您的迴應,但出現語法錯誤消息156,級別15,狀態1,行14 關鍵字'ON'附近的語法不正確。 – AymenRM

+0

是哪個引擎? – Sebas

+0

Sql Server ENTREPRISE Edition版本9.00.4035.00 – AymenRM

3

將您的WHERE語法移到您的LEFT OUTER JOIN語法下。

LEFT OUTER JOIN必須成爲FROM聲明的一部分。

+0

沒有工作,我只有兩個表,那些是兩個分開的查詢 – AymenRM

+0

@AymenRM:如果它不工作,那麼要麼你做錯了什麼,或者你忘了添加一些關於你的查詢的細節。 Valamas的建議是正確的:由於連接是FROM子句的一部分,並且WHERE子句必須位於FROM之後,即在所有連接之後,因此您的LEFT OUTER JOIN部分錯位。 –

+0

希望此編輯可以提供幫助,表格L_MAILITM_EVENTS_1和L_MAILITM_1只是L_MAILITM_EVENTS和L_MAILITM的圖片 – AymenRM