使用whilesqlserver
我有两个表,都包含列使用whilesqlserver,sql,sql-server,tsql,join,sql-update,Sql,Sql Server,Tsql,Join,Sql Update,我有两个表,都包含列名称和ID\u编号 表1包含列名称,ID\u编号,价格\u日期 表2包含列名称,ID\u编号,历史日期,注释 我正在尝试执行一个循环,这样它将从表1的ID\u Number列中的第一个值开始,并查看它是否与表2的ID\u Number列中的任何值匹配 如果存在匹配项,则比较该特定ID\u编号的两个表的“名称”。如果名称不匹配,则在注释列中,输入表1中的名称,并在表2中的历史日期中输入表1中的价格日期,只要可以避免,就不要在SQL中使用循环。SQL是一种基于集合的语言,没有
名称
和ID\u编号
包含列表1
,名称
,ID\u编号
价格\u日期
包含列表2
,名称
,ID\u编号
,历史日期
注释
ID\u Number
列中的第一个值开始,并查看它是否与表2的ID\u Number
列中的任何值匹配
如果存在匹配项,则比较该特定ID\u编号的两个表的“名称”。如果名称不匹配,则在注释
列中,输入表1中的名称
,并在表2中的历史日期
中输入表1中的价格日期
,只要可以避免,就不要在SQL中使用循环。SQL是一种基于集合的语言,没有针对迭代过程进行优化
根据您的解释,似乎您需要一个带有join
的update
语句。这应该满足您的要求:
update t2
set t2.comments = t1.names, t2.historical_date = t1.price_date
from table2 t2
inner join table1 t1
on t1.id_number = t2.id_number
and t1.names <> t2.names
更新t2
设置t2.comments=t1.names,t2.historical\u date=t1.price\u date
来自表2 t2
内连接表1 t1
在t1.id_编号=t2.id_编号上
和t1.names t2.names
这可以使用while逻辑,但听起来也可以使用基于集合的逻辑来完成,这应该是您的首选。这里有一个很好的链接,是的,这听起来像是一个简单的更新
和加入
。当然,,而
是您在这里应该使用的最后一条路线。SQL是一种基于集合的语言,因此使用基于集合的解决方案;它在迭代过程中表现得很糟糕(比如而),因为它的设计不是为了有效地执行它们。在使用SQL时,尽早改变思维定势,停止编程思维,这是一个非常重要的步骤。请展示一些示例数据和预期结果。当存在多个匹配时会发生什么情况?我强烈同意“如果可以避免”避免循环。当然,我只是想在@GMB的建议中添加f,但我还要声明,循环、增量递归cte、递归函数、标量函数、XML和其他形式的RBAR几乎可以一直避免。