2012-02-01 55 views
0

我在一个查询中需要帮助。我使用SQL Server 2008的SQL Server更新单列中有多个列的案例

我有三个表(它们更简单,只是举例):该表中

create table PriceComponents 
(id int, 
    summ money, 
    svkey1 int, 
    comission1 float, 
    svkey2 int, 
    comission2 float, 
    to_key int 
); 

create table Comissions 
(
id int, 
commission float, 
svkey int, 
to_key int 
); 

create table Goods 
(
to_key int 
); 

和简单的数据:

insert into Goods values (1), (2), (3); 

insert into Comissions values (1, 15, 1, 2), (2, 10, 2, 2), (3, 5, 1, 3); 

insert into PriceComponents values (1, 100, 1, 0, 2, 0, 2), (2, 200, 1, 0, 2, 0, 3); 

而且我想与查询:更新PriceComponentscomission1comission2列):

update dbo.PriceComponents 
set comission1 = case when Comissions.svkey=svkey1 then dbo.Comissions.commission else comission1 end, 
    comission2 = case when Comissions.svkey=svkey2 then dbo.Comissions.commission else comission2 end 
from dbo.PriceComponents 
left outer join dbo.Goods on dbo.PriceComponents.to_key = dbo.Goods.to_key 
left outer join dbo.Comissions on dbo.Goods.to_key = dbo.Comissions.to_key; 

这样的查询PriceComponents之前已经看起来像:

id summ svkey1 comission1 svkey2 comission2 to_key 
1 100,00 1  0   2  0   2 
2 200,00 1  0   2  0   3 

后:

id summ svkey1 comission1 svkey2 comission2 to_key 
1 100,00 1  15   2  0   2 
2 200,00 1  5   2  0   3 

但我希望这样的结果:

id summ svkey1 comission1 svkey2 comission2 to_key 
1 100,00 1  15   2  10   2 
2 200,00 1  5   2  0   3 

我真的不明白的地方我有一个错误。

回答

1

你是JOIN ing to_key,但试图从Comissions,其中只有一行将匹配从两个不同的行拉。

to_key值只会匹配Comissions行中的一个,这是第一个更新comission1的行。 Comission2将永远不匹配,因为to_keysvkey值在同一数据行上将不正确。

+0

谢谢你的回答。但是,如果我执行相同条件的select查询:select * from dbo.PriceComponents left outer join dbo.Goods on dbo.PriceComponents.to_key = dbo.Goods.to_key left outer join dbo.Comissions on dbo.Goods.to_key = dbo。 Comissions.to_key;我将有三排。可能是我错了,但我希望更新将使用此行和PriceComponents中的一行,我将有两个更新。如果是这样。我如何完成我的任务 - 更新PriceComponents中所有行的所有连接? – 2012-02-01 19:52:36

+0

您只有一行符合要求。为了满足要求,您可能需要对数据进行两次传递 – JNK 2012-02-01 19:57:54