Подзапрос SQL с LEFT JOIN, приводящий к ошибочной объектной ошибке

У меня есть запрос со следующей структурой:

РЕДАКТИРОВАТЬ Первоначальная структура запроса не была достаточно представительной.

SELECT   A
        ,B
        ,C
        ,D

FROM ( SELECT id,A
       FROM myTable 
       WHERE conditions 
       GROUP BY id,A) MainQuery
LEFT JOIN (SELECT id, B, C 
           FROM myView
           WHERE id IN
             (
                  SELECT DISTINCT id
                  FROM MainQuery
             )
          ) sub1
   ON sub1.B = MainQuery.A
LEFT JOIN (SELECT MainQuery.id, D
           FROM myOtherView
           WHERE sub1.id IN
             (
               SELECT DISTINCT id
               FROM MainQuery
             )
           ) sub2
   ON sub2.D = sub1.C

Когда я запускаю запрос, я получаю сообщение об ошибке Invalid object name 'MainQuery'. Когда я закомментирую LEFT JOINs и поля, которые они кормят в SELECT Заявление, запрос выполняется просто отлично. Я также пытался AS MainQuery, но я получаю тот же результат.

Я подозреваю, что это как-то связано с областью применения. Где я пытаюсь SELECT DISTINCT id FROM MainQuery, является MainQuery вне области для WHERE подзапрос в sub1?

Для контекста мне было поручено переписать запрос, который использовал временные таблицы, в запрос, который можно использовать в отчете, развернутом в SSRS 2000. Мой MainQuery, sub1, а также sub2 были временные таблицы в исходном запросе. В этих временных таблицах использовались подзапросы, которые я сохранил в своем переводе. Но исходный запрос имел то преимущество, что создавал каждую временную таблицу отдельно, а затем объединял результаты. Временные таблицы и подзапросы являются новыми для меня, поэтому я не уверен, как адаптироваться между ними, или если это даже правильный подход.

1 ответ

Решение

SQL для вашего MainQuery недействителен. Запустите его и посмотрите:

SELECT A, id
   FROM myTable 
   WHERE conditions 
   GROUP BY A

Вы не можете выбрать A и id, но только сгруппировать по A. Либо вам также нужно сгруппировать по id, или заключить id в агрегатную функцию, такую ​​как min или max.

С учетом этого, похоже, ваша другая проблема заключается в том, что вы говорите "LEFT JOIN", но затем размещаете столбец вашей таблицы LEFT JOINED в левой части предложения where. Смотрите ниже, где я переворачиваю sub1.B и MainQuery.A в JOIN.

SELECT   A
        ,B
        ,C
        ,D

FROM ( SELECT A, id
       FROM myTable 
       WHERE conditions 
       GROUP BY A,id) MainQuery
LEFT JOIN nutherTable sub1
on MainQuery.A = sub1.B
and MainQuery.id = sub1.id
LEFT JOIN (SELECT D ...) sub2
   ON sub1.C = sub2.D
Другие вопросы по тегам