例如,我得到了这个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
好的非常简单,我如何将stateId
从fc_states
复制到fc_Query
,但将其与StatesName
匹配,假设结果将是
Name StatesName StateId
Abee Alberta 6316
100 Mile House British Columbia 6317
谢谢,stateName
列类型均为text
答案 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) ;如果不止一场比赛发生了一些可怕的事情,撒旦胜利或美国经济步履蹒跚,我不确定是什么,只是永远不会让它发生。