Sql 左外部联接生成不正确的语法

Sql 左外部联接生成不正确的语法,sql,join,left-join,Sql,Join,Left 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 =

我对此查询有问题:

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
表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
更新:谢谢你的帮助

*因为我处理了大约2500个MAILITM_FID,所以此查询是否有其他方法可以确保速度性能?*

有人能帮忙吗? 谢谢

将WHERE语法移到左侧外部联接语法下面

左外部联接必须是FROM语句的一部分。

将WHERE语法移到左外部联接语法下面


左外部联接必须是FROM语句的一部分。

然后让我修改联接的位置:

    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))

我没有检查你连接的逻辑,我只是移动了它们。请尝试查看是否仍然存在此语法错误。

然后让我修改连接的位置:

    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))

我没有检查你连接的逻辑,我只是移动了它们。试试看是否还有这个语法错误。

联接是FROM的子类,它们不能出现在Where联接是FROM的子类之后,它们不能出现在Where不起作用之后,我只有两个表,这两个表是分开的query@AymenRM:如果它不起作用,然后要么你做错了什么,要么你忘了添加一些关于你的查询的细节。Valamas的建议是正确的:您的左侧外部联接部分放错了位置,因为联接是FROM子句的一部分,WHERE子句必须在FROM之后,也就是说,在所有联接之后。希望此编辑能有所帮助,表L_MAILITM_EVENTS_1和L_MAILITM_1只是L_MAILITM_事件的图像,L_MAILITMplease发布您编辑的代码,因为这仍然是不正确的对不起,但我怎么能做到这一点?没有工作,我只有两个表,这两个是分开的query@AymenRM:如果它不起作用,则可能是您做错了什么,或者您忘记添加有关查询的一些详细信息。Valamas的建议是正确的:您的左侧外部联接部分放错了位置,因为联接是FROM子句的一部分,WHERE子句必须在FROM之后,也就是说,在所有联接之后。希望此编辑能有所帮助,表L_MAILITM_EVENTS_1和L_MAILITM_1只是L_MAILITM_事件的图像,L_MAILITMplease发布您编辑的代码,因为这仍然是不正确的对不起,但是我怎么做呢?感谢您的回复,但是在关键字“ON”附近出现语法错误Msg 156,级别15,状态1,第14行不正确的语法。Sql Server Enterprise Edition版本9.00.4035.00我现在更改了一些别名,联接没有可参考的别名。您现在可以试试吗?谢谢您的回复,但是在关键字“ON”附近出现语法错误Msg 156,级别15,状态1,第14行语法错误。Sql Server Enterprise Edition版本9.00.4035.00I现在更改了一些别名,联接没有可参考的别名。你现在能试试吗?