多次指定相关名称“CONVERT"

时间:2023-02-08
本文介绍了多次指定相关名称“CONVERT"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

在@avery_larry 的帮助下,我完成了查询,但现在面临的问题很少.我可以从另外 2 个表中添加金额.现在我必须从同一个表中添加两个不同部分的金额,没有列.第 1 列是第 1 部分,第 2 列是第 2 部分.金额栏相同.当我添加子查询时,我收到错误消息在 FROM 子句中多次指定了相关名称 CONVERT."CONVERT 是表名.这是我的代码.

With the help of @avery_larry, I done my query but now facing little problem. I am able to add amount from another 2 tables. Now I have to add amount from same table with two different part no columns. 1st col is part1 and 2nd col is part2. Amount column is same. When I add sub query, I am getting error that "The correlation name CONVERT is specified multiple times in a FROM clause." CONVERT is table name. Here is my code.

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

目前,为了绕过错误,我制作了另一个带有差异名称的表.但是有两个具有相同数据的表并定期用新数据更新这两个表是一个问题.我宁愿解决错误并只使用一张表.

Currently, to bypass error, I have made another table with diff name. But having two tables with same data and updating both with new data regularly is a problem. I would rather resolve the error and use only one table.

请帮忙.

推荐答案

@Kryesec 是正确的.每个子查询必须有一个唯一的别名.

@Kryesec is correct. Each subquery must have a unique alias.

你不能这样做:

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] 设置别名,因为它在每个子查询中都是唯一的(在范围内是唯一的).但是每个子查询都必须有一个唯一的别名,这就是您的错误消息的来源.

This has [CONVERT] defined twice. Because there is no way to know which [CONVERT].col1 we would actually want, this is invalid and produces the error you see.
You CAN use [CONVERT] multiple times as the table your are selecting FROM. To do so, though, each reference must be unique in scope. Meaning you don't have to alias [CONVERT] inside each subquery because it is unique inside each subquery (unique in scope). BUT each subquery then must have a unique alias, and that is where your error message comes from.

以下是我认为您想要的代码.注意我从子查询内部删除了别名——它们是不必要的,尽管它们同样不会引起任何问题.应该解决您的错误的主要更改是将最后 2 个子查询从使用别名 [CONVERT] 更改为使用别名 [FROM_CONVERT][TO_CONVERT] 分别.

The following is what I think you want your code to be. Note I removed the aliases from inside the subqueries -- they are unnecessary, though equally they are not causing any problems. The primary change that should resolve your error is changing the final 2 subqueries from both using alias [CONVERT] to using the aliases [FROM_CONVERT] and [TO_CONVERT] respectively.

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] 的表.也许此时您无法对设计进行任何更改,但如果可以,您应该这样做,并且您应该在未来的任何项目中记住这一点.

As a side note -- you'll probably be happier if you do not use spaces in any of your column names or aliases or tables etc. This allows you to avoid quotes/square brackets. In your code, as one example, I would suggest AS COST_ALL on COST_ALL.PART = and select ... sum(amt) as FROM_TOTAL.
Additionally, it is (very) bad design to use any keywords for names of tables, columns, databases etc. It looks like you have a table named [CONVERT]. Perhaps you cannot change anything with your design at this point, but you should if you can, and you should remember this for any future projects.

这篇关于多次指定相关名称“CONVERT"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:T-SQL 左连接不返回空列 下一篇:修改现有小数位信息

相关文章

最新文章