Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用whilesqlserver_Sql_Sql Server_Tsql_Join_Sql Update - Fatal编程技术网

使用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编号
    历史日期
    注释
我正在尝试执行一个循环,这样它将从表1的
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几乎可以一直避免。