SQL Server - 跨表复制数据,但仅在与特定列名匹配时才复制数据

时间:2012-03-22 04:08:31

标签: sql sql-server

例如,我得到了这个2表

dbo.fc_states

StateId     Name
6316        Alberta
6317        British Columbia

和dbo.fc_Query

Name              StatesName          StateId
Abbotsford        Quebec              NULL
Abee              Alberta             NULL
100 Mile House    British Columbia    NULL

好的非常简单,我如何将stateIdfc_states复制到fc_Query,但将其与StatesName匹配,假设结果将是

Name              StatesName            StateId
Abee              Alberta               6316
100 Mile House    British Columbia      6317

谢谢,stateName列类型均为text

2 个答案:

答案 0 :(得分:2)

怎么样:

update fc_Query set StateId =
  (select StateId from fc_states where fc_states.Name = fc_Query.StatesName)

这应该会给你你正在寻找的结果。

答案 1 :(得分:1)

这与Eddie的做法不同,我喜欢MERGE的更新,如果它们不是简单的死(就像我不会认为你的死很简单)。所以如果你感到无聊/好奇也试试

WITH stateIds as
   (SELECT name, MAX(stateID) as stID
   FROM fc_states
   GROUP BY name)
MERGE fc_Query
   on stateids.name = fc_query.statesname
WHEN MATCHED THEN UPDATE 
   SET fc_query.stateid = convert(int, stid)
 ;

第一部分来自" WITH"对于GROUP BY NAME),是一个CTE,它创建一个类似于表格的东西 - 一个名字' stateIds'这是一个很好的查询后续部分的表格 - 其中每个州名称只保证一行。然后MERGE在fc_query中查找具有匹配名称的任何内容。如果匹配,则根据需要设置。如果你不想在fc_query中覆盖现有的状态,你可以做一个小编辑:

WITH stateIds as
   (SELECT name, MAX(stateID) as stID
   FROM fc_states
   GROUP BY name)
MERGE fc_Query
   ON stateids.name = fc_query.statesname
   AND fc_query.statid IS NOT NULL
WHEN MATCHED THEN UPDATE 
   SET fc_query.stateid = convert(int, stid)
   ;

你可以让它做一些与不匹配的行不同的东西。所以我认为MERGE适用于很多应用程序。在MERGE语句结束时你需要一个分号,你必须保证在目标中的每一行中只有一个匹配或零匹配(即#34; stateids",我的CTE) ;如果不止一场比赛发生了一些可怕的事情,撒旦胜利或美国经济步履蹒跚,我不确定是什么,只是永远不会让它发生。