Sql server 基于另一个表中的记录更新行中的列

Sql server 基于另一个表中的记录更新行中的列,sql-server,Sql Server,在阅读我的问题之前,请先看下图 如果您无法查看上述图片,请单击链接查看数据库设计的图像和表数据 我想通过将列名(酒店)与便利设施(便利设施)匹配,用表“便利设施”中“状态”列中的值更新表“Hotels”中的“Parking、AC、TV、locallcalls”等列。 Hid是关联表的关键约束。 它就像一个转置。一个表中的行值应根据某些条件更新另一个表中的coulmns 请帮忙 我的桌子上有大约10000张唱片。如果我使用的是动态查询、游标或循环。执行速度非常慢,性能非常差 请帮忙 谢谢 我使用

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

如果您无法查看上述图片,请单击链接查看数据库设计的图像和表数据

我想通过将列名(酒店)与便利设施(便利设施)匹配,用表“便利设施”中“状态”列中的值更新表“Hotels”中的“Parking、AC、TV、locallcalls”等列。 Hid是关联表的关键约束。 它就像一个转置。一个表中的行值应根据某些条件更新另一个表中的coulmns

请帮忙

我的桌子上有大约10000张唱片。如果我使用的是动态查询、游标或循环。执行速度非常慢,性能非常差

请帮忙

谢谢

我使用了子查询/动态查询。由于记录数为10000,因此速度非常慢


有没有其他方法可以更快地处理多个更新查询?我正在使用SQLServer2000。请帮助

您可以使用内部select语句找到正确的值。。。所以对于停车场来说,它可能看起来像

UPDATE Hotel 
SET 
 Parking = (SELECT Status FROM Amenity WHERE Amenity.hid = Hotel.hid AND Amenity.AmenityDesc = 'Parking')
对数据模型说几句话

我会将AmentityDesc重命名为Description(这使得amentity.Description…)


实体名称约定:hotel and Amentity->hotel and Amentity

您可以使用内部select语句查找正确的值。。。所以对于停车场来说,它可能看起来像

UPDATE Hotel 
SET 
 Parking = (SELECT Status FROM Amenity WHERE Amenity.hid = Hotel.hid AND Amenity.AmenityDesc = 'Parking')
对数据模型说几句话

我会将AmentityDesc重命名为Description(这使得amentity.Description…)


实体名称约定:hotel and Amency->hotel and Amency

我不相信不借助动态SQL就可以通过单个查询实现这一点,因为列名是可变的,并且不能在T-SQL中使用变量表示列名

您可以使用一组带有子查询的单独查询来检索Yves M提到的数据,或者使用如下连接

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

并对您希望更新的酒店中的每一列重复此操作。

我不相信您可以在不使用动态SQL的情况下使用单个查询来完成此操作,因为列名是可变的,并且您不能在T-SQL中使用变量来表示列名

您可以使用一组带有子查询的单独查询来检索Yves M提到的数据,或者使用如下连接

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

并对hotel中要更新的每个列重复此操作。

您可以使用动态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

您可以使用动态sql为您生成update语句,手动运行它们,或者取消注释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

您已经问了8个其他问题,但未接受任何答案。如果你接受更多,你可能会得到更高质量的答案。从课文中很难理解,你真正想要的是什么……你已经问了8个其他问题,但没有接受任何答案。如果你接受更多,你可能会得到更高质量的答案。从文本中很难理解,你真正想要的是什么。。。