Имя корреляции «CONVERT» указывается несколько раз - PullRequest
0 голосов
/ 21 ноября 2019

С помощью @avery_larry я выполнил свой запрос, но теперь столкнулся с небольшой проблемой. Я могу добавить сумму из двух других таблиц. Теперь я должен добавить сумму из одной таблицы с двумя разными частями без столбцов. 1-й столб - часть 1, а второй - часть 2. Колонка суммы такая же. Когда я добавляю подзапрос, я получаю сообщение об ошибке «Имя корреляции CONVERT указано несколько раз в предложении FROM». CONVERT - это имя таблицы. Вот мой код.

SELECT  dbo.[PART LIST].PART, 
        [COST ALL].[cost total], 
        [SELL ALL].[sell total], 
        [CONVERT].[FROM total], 
        [convert].[TO total]
FROM    
    dbo.[PART LIST] 
LEFT OUTER JOIN (SELECT PART, SUM(AMT) AS [cost total]
     FROM  dbo.[COST ALL] AS [COST ALL_1]
     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] AS [SELL ALL_1]
    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] AS CONVERT_1
    GROUP BY [From PART] ) AS [CONVERT] ON [CONVERT].[From PART] = dbo.[PART LIST].PART 
LEFT OUTER JOIN (SELECT [TO PART], SUM(Amt) AS [TO total]
    FROM dbo.[convert] AS CONVERT_1
    GROUP BY [TO PART] ) AS [CONVERT] ON [CONVERT].[TO PART] = dbo.[PART LIST].PART

В настоящее время, чтобы обойти ошибку, я создал еще одну таблицу с именем diff. Но наличие двух таблиц с одинаковыми данными и регулярное обновление обеих новых данных является проблемой. Я предпочел бы устранить ошибку и использовать только одну таблицу.

Pl help.

Ответы [ 3 ]

1 голос
/ 21 ноября 2019

@ Крисек прав. Каждый подзапрос должен иметь уникальный псевдоним.

Вы не можете сделать это:

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]. Возможно, вы не можете ничего изменить с вашим дизайном на данный момент, но вы должны, если можете, и вы должны помнить это для любых будущих проектов.

1 голос
/ 21 ноября 2019

Ваши последние 2 подзапроса являются псевдонимами, так как [CONVERT] Измените один из них

0 голосов
/ 21 ноября 2019

Мое предложение будет по-прежнему конвертировать зарезервированное ключевое слово. Измените его на другое имя convert1 и т. Д. Уже псевдоним в вашем запросе, я думаю, должен был дать вам некоторую ошибку, прежде чем наложить псевдоним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...