@ Крисек прав. Каждый подзапрос должен иметь уникальный псевдоним.
Вы не можете сделать это:
select *
from (
select col1
from table1
) AS [CONVERT]
left outer join (
select col1
from table2
) AS [CONVERT] on [CONVERT].col1 = [CONVERT].col1
Это [CONVERT]
определено дважды. Поскольку нет никакого способа узнать , какой [CONVERT].col1
мы бы на самом деле хотели, это неверно и приводит к появившейся ошибке.
Вы МОЖЕТЕ использовать [CONVERT]
несколько раз в качестве таблицы, которую вы выбираете FROM
. Однако для этого каждая ссылка должна быть уникальной в области действия . Это означает, что вам не нужно указывать псевдоним [CONVERT]
внутри каждого подзапроса, поскольку он уникален внутри каждого подзапроса (уникален по объему). НО каждый подзапрос должен иметь уникальный псевдоним, и именно отсюда исходит ваше сообщение об ошибке.
Ниже приведено то, что, я думаю, вы хотите, чтобы ваш код был,Обратите внимание, что я удалил псевдонимы из подзапросов - они не нужны, хотя в равной степени они не вызывают никаких проблем. Основное изменение, которое должно устранить вашу ошибку, - это изменение последних двух подзапросов с псевдонима [CONVERT]
на псевдонимы [FROM_CONVERT]
и [TO_CONVERT]
соответственно.
SELECT dbo.[PART LIST].PART,
[COST ALL].[cost total],
[SELL ALL].[sell total],
[FROM_CONVERT].[FROM total],
[TO_CONVERT].[TO total]
FROM dbo.[PART LIST]
LEFT OUTER JOIN (SELECT PART, SUM(AMT) AS [cost total]
FROM dbo.[COST ALL]
WHERE (STREAM = N'Y') AND (USAGE = N'MUM')
GROUP BY PART
) AS [COST ALL] ON [COST ALL].PART = dbo.[PART LIST].PART
LEFT OUTER JOIN (SELECT PART, SUM(AMT) AS [sell total]
FROM dbo.[SELL ALL]
WHERE (STREAM = N'FSA') AND (USAGE = N'MUM')
GROUP BY PART
) AS [SELL ALL] ON [SELL ALL].PART = dbo.[PART LIST].PART
LEFT OUTER JOIN (SELECT [From PART], SUM(Amt) AS [FROM total]
FROM dbo.[convert]
GROUP BY [From PART]
) AS [FROM_CONVERT] ON [FROM_CONVERT].[From PART] = dbo.[PART LIST].PART
LEFT OUTER JOIN (SELECT [TO PART], SUM(Amt) AS [TO total]
FROM dbo.[convert]
GROUP BY [TO PART]
) AS [TO_CONVERT] ON [TO_CONVERT].[TO PART] = dbo.[PART LIST].PART
В качестве примечания - выВозможно, вам будет лучше, если вы не используете пробелы в именах столбцов, псевдонимах, таблицах и т. д. Это позволяет вам избегать кавычек / квадратных скобок. В вашем коде, в качестве одного примера, я бы предложил AS COST_ALL on COST_ALL.PART =
и select ... sum(amt) as FROM_TOTAL
.
Кроме того, (очень) плохой дизайн - использовать любые ключевые слова для имен таблиц, столбцов, баз данных и т. Д. Похоже, у вас естьтаблица с именем [CONVERT]. Возможно, вы не можете ничего изменить с вашим дизайном на данный момент, но вы должны, если можете, и вы должны помнить это для любых будущих проектов.