Подзапрос 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