我在sql server 2012中有一个包含两种类型的主表。
这些是我在主表中的关键列:
TYPE CATEGORYGROUP CREDITORNAME DEBITORNAME
这两种类型中的一种(类型B)没有分配给它的类别组(因此它总是为空)。
A类总是有一个CategoryGroup和Debitor。
B类总是有债权人但没有分类。
对于债权人和债务人,我有两个额外的表也持有CategoryGroup但是对于我的任务我只需要债权人的表,因为我已经有了A型(债务人)的正确价值。
所以我的目标是根据债权人名称在债权人表中查找CategoryGroup,并理想地将这些CategoryGroup值放在我的主表中。 使用" put"我不确定是应该生成一个视图还是实际将数据放入包含大约150万条记录的表中并继续增长。
还有一个"群集表"使用CategoryGroup作为关键字段。但这不是我问题的一部分。
请查看我的示例fiddle
希望你能帮助我。 谢谢。答案 0 :(得分:3)
如果我理解正确,您只需执行连接即可找到正确的值,并使用该值更新MainData;
您可以使用公用表格式...
WITH cte AS (
SELECT a.*, b.categorygroup cg
FROM MainData a
JOIN CreditorList b
ON a.creditorname = b.creditorname
)
UPDATE cte SET categorygroup=cg;
...或更新/加入;
UPDATE m
SET m.categorygroup = c.categorygroup
FROM maindata m
JOIN creditorlist c
ON m.creditorname = c.creditorname;
...并且始终记得在生产数据上从Internet上的随机用户运行可能具有破坏性的SQL之前进行测试。
编辑:要在不进行更新的情况下以相同格式查看日期,您可以使用;
SELECT
a.type, COALESCE(a.categorygroup, b.categorygroup) categorygroup,
a.creditorname, a.debitorname
FROM MainData a
LEFT JOIN CreditorList b
ON a.creditorname = b.creditorname
答案 1 :(得分:1)
你不能这样做:
update maindata
set categorygroup = (
select top 1 categorygroup
from creditorlist
where creditorname = maindata.creditorname)
where creditorname is not null
and categorygroup is null
答案 2 :(得分:0)
试试这个 -
update m
set m.CategoryGroup = cl.CategoryGroup
-- select m.creditorName,
-- m.CategoryGroup as Dest,
-- cl.CategoryGroup as Src
from maindata as m
left join creditorlist as cl
on m.creditorName = cl.creditorName
where m.creditorName is not null
在更新之前,您可以通过取消注释update语句并删除更新来检查查询结果。