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

генерируется ошибка

Msg 156, Level 15, State 1, Line 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 для вас Г помощь

* есть другой способ для этого запроса, чтобы обеспечить скоростные характеристики, потому что я лечить около 2500 MAILITM_FID? *

Может кто-нибудь помочь? thanks

+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

Спасибо за ваш ответ, но там синтаксическая ошибка Msg 156, Level 15, State 1, Line 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: Если это не сработало, то либо вы что-то сделали неправильно, либо забыли добавить некоторые сведения о вашем запросе. Предложение Валамаса верное: ваша часть LEFT OUTER JOIN неуместна, потому что соединения являются частью предложения FROM, и предложение WHERE должно идти после FROM, то есть после всех объединений. –

+0

надеюсь, что это редактирование может помочь, таблицы L_MAILITM_EVENTS_1 и L_MAILITM_1 - это только изображение L_MAILITM_EVENTS и L_MAILITM – AymenRM