如何根据另一个表中另一列的值更新表中的列

问题描述 投票:1回答:2

我有一个table A,有两个主要栏目:NameSettingsSettings列将具有3个值:1,2或3。

例如:

表A:

Name     Settings
Andre        1
Andre        1
Betty        3
Charles      1
Charles      1

请注意,1 Name只能有1个Settings:1,2或3。

我有另外一个table B,有两个主要栏目:NameTypeType专栏由许多值组成,如:'TypeA''TypeB''TypeC' ......

例如:

表B:

Name       Type
Andre      TypeA
Andre      TypeA
Andre      TypeC
Betty      TypeB
Betty      TypeB
Betty      TypeD
Charles    TypeB
Charles    TypeA
Charles    TypeA
.....

请注意,1 Name可以有多个相同或不同的Type。而我们只是考虑关于TypeATypeB

现在我想使用Settings中的table A列从'Type'更新table B列,如果:

  • 来自Typetable B列具有'TypeA'的值,然后更新所有记录,从两个表中具有相同的Name,在Settingstable A列上更新为1。
  • 来自Typetable B列具有'TypeB'的值,然后更新所有记录,从两个表中具有相同的Name,到Settingstable A列上的2。
  • 来自Typetable B列具有'TypeA''TypeB'的值,然后更新所有记录,从两个表中具有相同的Name,到Settingstable A列上的3。

table A的结果应该是这样的:

Name     Settings
Andre        1
Andre        1
Andre        1
Betty        2
Charles      3
Charles      3

我该怎么做?

sql sql-server tsql sql-update
2个回答
1
投票

我相信聚合的相关子查询可能会完成工作,例如:

UPDATE ta
SET Settings = (
    SELECT
        CASE 
            WHEN MAX(tb.Type) = 'TypeA' AND MIN(tb.Type) = 'TypeA' THEN 1
            WHEN MAX(tb.Type) = 'TypeB' AND MIN(tb.Type) = 'TypeB' THEN 2
            ELSE 3
       END
    FROM TableB tb
    WHERE tb.Name = ta.Name AND Type in ('TypeA', 'TypeB')
    GROUP BY tb.Name
)
FROM TableA ta

在这个带有样本数据的demo on DB Fiddle中,这是TableA执行后的UPDATE的内容:

Name    | Settings
:------ | -------:
Andre   |        1
Andre   |        1
Betty   |        2
Charles |        3
Charles |        3

1
投票

更新可以加入一个子查询,该查询为TableB的每个名称计算这些类型。 然后可以基于这些总计计算新的“设置”。

UPDATE a
SET a.Settings = (CASE
                  WHEN b.TotalTypeA > 0 AND b.TotalTypeB > 0 THEN 3
                  WHEN b.TotalTypeB > 0 THEN 2
                  WHEN b.TotalTypeA > 0 THEN 1
                  ELSE 0
                  END)
FROM TableA a
LEFT JOIN 
(
  SELECT Name, 
  COUNT(CASE WHEN Type = 'TypeA' THEN 1 END) TotalTypeA,
  COUNT(CASE WHEN Type = 'TypeB' THEN 1 END) TotalTypeB
  FROM TableB 
  GROUP BY Name
) b 
ON b.Name = a.Name;

对RexTester here的测试

© www.soinside.com 2019 - 2024. All rights reserved.