Sql 更新语句赢得';不要更新任何东西

Sql 更新语句赢得';不要更新任何东西,sql,sql-server,tsql,join,sql-update,Sql,Sql Server,Tsql,Join,Sql Update,我一直在使用SSMS为一个类项目创建一个配方数据库。我有一个表,其中包含插入到查找表中的所有配方名称(recipedeails),但我忽略了它们的关联ID,因此我想编写一些代码,用这些值更新我的表。我觉得这段代码应该可以正常工作(它在过去似乎可以正常工作,但我搞砸了一些不相关的事情,不得不恢复我最近的数据库备份),但现在不行了。它说它影响了我希望它影响的所有行,但这些行仍然将RecipeID列为NULL 我从配方表中提取数据,其中包括每个配方的名称和每个配方的ID。在RecipeDetails中

我一直在使用SSMS为一个类项目创建一个配方数据库。我有一个表,其中包含插入到查找表中的所有配方名称(
recipedeails
),但我忽略了它们的关联ID,因此我想编写一些代码,用这些值更新我的表。我觉得这段代码应该可以正常工作(它在过去似乎可以正常工作,但我搞砸了一些不相关的事情,不得不恢复我最近的数据库备份),但现在不行了。它说它影响了我希望它影响的所有行,但这些行仍然将
RecipeID
列为
NULL

我从
配方表
中提取数据,其中包括每个配方的名称和每个配方的ID。在
RecipeDetails
中,我有一列用于
RecipeName
RecipeID
成分
IngredenId
,以及表中每一行的ID。到目前为止,我的所有食谱都在表中,但没有它们的关联ID。我想将ID从一个表移到另一个表

UPDATE rd    
SET rd.RecipeID = rt.RecipeID    
FROM RecipeDetail AS rd    
FULL JOIN RecipesTable AS rt ON rd.RecipeID = rt.RecipeID    
WHERE rt.RecipeName = rd.RecipeName;

您应该使用
内部联接
而不是外部联接

UPDATE rd
    SET rd.RecipeID = rt.RecipeID
    FROM RecipeDetail rd JOIN
         RecipesTable rt
         ON rd.RecipeName = rt.RecipeName;

什么是不工作?
recipename
来自哪里?不工作意味着ID在我的RecipeDetail表中仍然为空。RecipeName来自RecipeTable,该表按名称列出所有配方,但不包括任何成分。由于where子句,您的完全联接在逻辑上转换为内部联接。您在RecipeID上进行连接,因此设置相同的列似乎没有任何逻辑意义,因为当您将某些内容设置为现有值时,您无法“看到”任何更改。大概您添加了输入错误“rt.RecipID”。您还应该修复您的模式。RecipesDetail和RecipesTable之间应该有一个外键。若您打算加入RecipeName,那个么它应该是RecipeTable中唯一的列。RecipesDetail不应重复名称-这是配方的属性,而不是细节的属性。这里似乎有很多工作要做。请提供示例数据和所需结果。内部连接不做任何事情,它只更新我已经硬编码RecipeID的行(您可能会想象,不需要更新)@blork。这是一个非常好的观察。我更新了答案,没有骰子。正如我所说的,
recipedeail
中不包含
RecipeID
值,因此
内部联接不会更新那些需要更新的值。一个
完全加入
昨晚效果很好(我想——我开始怀疑这是否只是一个美丽的梦)。SSMS告诉我这些行(当使用
完全联接时
)已经更新,但当我再次检查时,它们仍然显示为
null
@blork。连接在名字上,而不是id上。这就是为什么阅读理解很重要。非常感谢你!