根据另一个表中的记录更新一行中的列

时间:2010-08-20 11:00:08

标签: sql-server

在阅读我的问题之前,请先查看下图。

Image

如果您无法查看上面的图片,请点击this链接查看数据库设计图像和表格数据。

我想通过将列名称(酒店)与AmenityDesc相匹配,使用表格“amenity”中“Status”列中的值更新“Hotels”表中的“Parking,AC,TV,locallcalls”等栏目(在舒适中)。 Hid是关联表的关键约束。 它就像一个转置。一个表中的行值应该在某些条件下更新其他表中的coulmns。

请帮忙。

我的桌子上有大约10,000条记录。如果我使用动态查询,光标或循环。执行速度很慢,性能非常差。

请帮助。

由于

我使用了子查询/动态查询。因为记录数是10000,所以非常慢。

还有其他方法可以更快地处理多个更新查询吗?我正在使用sqlserver 2000.请帮助

3 个答案:

答案 0 :(得分:1)

您可以使用内部选择语句来查找正确的值...因此,对于停车场,它可能看起来像......

UPDATE Hotel 
SET 
 Parking = (SELECT Status FROM Amenity WHERE Amenity.hid = Hotel.hid AND Amenity.AmenityDesc = 'Parking')

对数据模型说几句话......

我会将AmenityDesc重命名为Description(这使得Amenity.Description ...)

实体名称惯例:酒店和便利设施 - >酒店和便利设施

答案 1 :(得分:0)

我不相信你可以使用单个查询来执行此操作而不使用动态SQL,因为列名是变量的,并且您不能使用变量来表示T-Sql中的列名

您可以使用一组带子查询的单个查询来检索Yves M或JOIN所提及的数据,如下所示

UPDATE hotel
SET    Parking = Amenity.Status
FROM   hotel
JOIN   Amenity ON Amenity.hid = hotel.hid
WHERE  Amenity.AmenityDesc = 'Parking'

并重复您希望更新的酒店中的每一栏。

答案 2 :(得分:0)

您可以使用动态sql为您生成更新语句,并手动运行它们或取消注释exec行并让它们立即运行

create table #amenity (amenitydesc nvarchar(50))
insert into #amenity(amenitydesc) select distinct amenitydesc from Amenity
declare @amenity nvarchar(50)
declare @sql nvarchar(max)
select @amenity = min(amenitydesc) from #amenity
while @amenity is not null
begin
    select @sql = 'update hotel set ' + @amenity + ' = amenity.status from amenity join hotel on amenity.hid = hotel.hid where amenity.amenityDesc =  ''' + @amenity + '''' 

    --exec(@sql)
    select @sql

    select @amenity = min(amenitydesc) from #amenity where amenitydesc > @amenity
end