Обновление сервера sql из избранных - PullRequest
1 голос
/ 06 июня 2011

После ответа от этого поста у меня есть что-то вроде этого:

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

и фактическое сообщение об ошибке:

Сервер: Msg 107, Уровень 16, Состояние 2, Строка 1 Префикс столбца 'summary' не совпадает с именем таблицы или псевдонимом, используемым взапрос.

Ответы [ 3 ]

1 голос
/ 06 июня 2011

Я отправляю вам этот измененный запрос:

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 внутри и снаружи сложного запроса. Я переупорядочил соединения так, как они мне нравятся (сначала ссылались на таблицу вначале), и явно записал pr_pk в 2 местах. Я также изменил синтаксис обновления, чтобы использовать update <alias>.

0 голосов
/ 06 июня 2011

Я не смог воспроизвести вашу ошибку, используя SQL 2008 на уровне совместимости 80. Хотя эта опция не гарантирует, что я получу те же результаты, что и вы, ничто не кажется неуместным.

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
0 голосов
/ 06 июня 2011

Возможно, это не тот ответ, который вы ищете, но вместо генерации чрезвычайно сложных запросов я обычно по умолчанию вставляю некоторый сложный запрос в переменную таблицы.Затем вы можете выполнить простое обновление MyTable с помощью присоединения к табличной переменной.Возможно, он не так эффективен, но его гораздо проще поддерживать.

...