TSQL - 根据查找表在表中插入值

时间:2014-03-26 18:37:08

标签: sql sql-server tsql lookup

我在sql server 2012中有一个包含两种类型的主表。

这些是我在主表中的关键列:

TYPE    CATEGORYGROUP   CREDITORNAME    DEBITORNAME

这两种类型中的一种(类型B)没有分配给它的类别组(因此它总是为空)。

A类总是有一个CategoryGroup和Debitor。

B类总是有债权人但没有分类。

对于债权人和债务人,我有两个额外的表也持有CategoryGroup但是对于我的任务我只需要债权人的表,因为我已经有了A型(债务人)的正确价值。

所以我的目标是根据债权人名称在债权人表中查找CategoryGroup,并理想地将这些CategoryGroup值放在我的主表中。 使用" put"我不确定是应该生成一个视图还是实际将数据放入包含大约150万条记录的表中并继续增长。

还有一个"群集表"使用CategoryGroup作为关键字段。但这不是我问题的一部分。

请查看我的示例fiddle

希望你能帮助我。 谢谢。

3 个答案:

答案 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;

An SQLfiddle to test with

...或更新/加入;

UPDATE m
SET m.categorygroup = c.categorygroup
FROM maindata m
JOIN creditorlist c
  ON m.creditorname = c.creditorname;

Another SQLfiddle

...并且始终记得在生产数据上从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

Yet another SQLfiddle

答案 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语句并删除更新来检查查询结果。