在阅读我的问题之前,请先查看下图。
如果您无法查看上面的图片,请点击this链接查看数据库设计图像和表格数据。
我想通过将列名称(酒店)与AmenityDesc相匹配,使用表格“amenity”中“Status”列中的值更新“Hotels”表中的“Parking,AC,TV,locallcalls”等栏目(在舒适中)。 Hid是关联表的关键约束。 它就像一个转置。一个表中的行值应该在某些条件下更新其他表中的coulmns。
请帮忙。
我的桌子上有大约10,000条记录。如果我使用动态查询,光标或循环。执行速度很慢,性能非常差。
请帮助。
由于
我使用了子查询/动态查询。因为记录数是10000,所以非常慢。
还有其他方法可以更快地处理多个更新查询吗?我正在使用sqlserver 2000.请帮助
答案 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