1

按照这篇文章的回答,我有这样的事情:

update MyTable
set column1 = otherTable.SomeColumn,
    column2 = otherTable.SomeOtherColumn
from MyTable
inner join
(select *some complex query here*) as otherTable
on MyTable.key_field = otherTable.key_field;

但是,我不断收到此错误:

列前缀“otherTable”与查询中使用的表名或别名不匹配。

我不确定出了什么问题。我不能从这样的选择查询中进行这样的更新吗?任何帮助将不胜感激。

(我正在使用 *blush* sql server 2000。)

编辑:

这是实际的查询

update pdx_projects set pr_rpc_slr_amount_year_to_date = summary.SumSLR, pr_rpc_hours_year_to_date = summary.SumHours
    from pdx_projects pr join (
select  pr.pr_pk pr_pk, sum(tc.stc_slr_amount)  SumSLR, sum(tc.stc_worked_hours)  SumHours from pdx_time_and_cost_from_rpc tc 
    join pdx_rpc_projects sp on tc.stc_rpc_project_id = sp.sol_rpc_number
    join pdx_rpc_links sl on sl.sol_fk = sp.sol_pk
    join pdx_projects pr on pr_pk = sl.pr_fk
    where tc.stc_time_card_year = year(getdate())
    group by pr_pk
) as summary

on pr.pr_pk = summary.pr_pk

实际的错误信息是

服务器:消息 107,级别 16,状态 2,第 1 行列前缀“摘要”与查询中使用的表名或别名不匹配。

4

3 回答 3

1

我向您提交了这个修改后的查询:

update x
set x.pr_rpc_slr_amount_year_to_date = summary.sumSLR, 
    x.pr_rpc_hours_year_to_date = summary.sumHours
from pdx_projects x
join (
    select  pr.pr_pk as pr_pk, 
            sum(tc.stc_slr_amount) as SumSLR, 
            sum(tc.stc_worked_hours) as SumHours 
    from pdx_time_and_cost_from_rpc tc 
    join pdx_rpc_projects sp on tc.stc_rpc_project_id = sp.sol_rpc_number
    join pdx_rpc_links sl on sp.sol_pk = sl.sol_fk
    join pdx_projects pr on sl.pr_fk = pr.pr_pk
    where tc.stc_time_card_year = year(getdate())
    group by pr.pr_pk
) as summary
on x.pr_pk = summary.pr_pk

这里明显不同:我不在pr复杂查询的内部和外部重复使用别名。我以我喜欢的方式重新排序了连接(之前首先引用了表),并在 2 个地方明确标注了 pr_pk。我还将更新语法更改为使用update <alias>.

于 2011-06-06T19:36:35.283 回答
0

也许不是您正在寻找的答案,但我通常默认将一些复杂的查询插入到表变量中,而不是生成非常复杂的查询。然后,您可以通过连接表变量对 MyTable 进行简单更新。它可能效率不高,但更容易维护。

于 2011-06-06T19:24:34.933 回答
0

我无法使用 80 兼容级别的 SQL 2008 复制您的错误。虽然此选项不能保证我会得到与您相同的结果,但似乎没有什么不合适的。

create table pdx_projects
(
    pr_rpc_slr_amount_year_to_date varchar(max)
    , pr_rpc_hours_year_to_date varchar(max)
    , pr_pk varchar(max)

)

create table pdx_time_and_cost_from_rpc
(
    stc_slr_amount decimal
    , stc_worked_hours decimal
    , stc_rpc_project_id varchar(max)
    , stc_time_card_year varchar(max)
)

create table  pdx_rpc_projects
(
    sol_rpc_number varchar(max)
    , sol_pk varchar(max)
)

create table pdx_rpc_links
(
    sol_fk varchar(max)
    , pr_fk varchar(max)
)


update pdx_projects
set
    pr_rpc_slr_amount_year_to_date = summary.SumSLR
    , pr_rpc_hours_year_to_date = summary.SumHours
from
    pdx_projects pr
join (
    select  pr.pr_pk pr_pk
        , sum(tc.stc_slr_amount)  SumSLR
        , sum(tc.stc_worked_hours)  SumHours
    from pdx_time_and_cost_from_rpc tc 
    join pdx_rpc_projects sp on tc.stc_rpc_project_id = sp.sol_rpc_number
    join pdx_rpc_links sl on sl.sol_fk = sp.sol_pk
    join pdx_projects pr on pr_pk = sl.pr_fk
    where tc.stc_time_card_year = year(getdate())
    group by pr_pk
    ) as summary
    on pr.pr_pk = summary.pr_pk
于 2011-06-06T19:44:12.270 回答