2012-06-03 21 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