如何基于另一个表中另一列的值更新表中的列

时间:2019-03-31 13:44:24

标签: sql sql-server tsql sql-update

我有一个table A,其中有2个主要列: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列,如果:

  • 来自Type的{​​{1}}列的值为table B,然后将两个表中具有相同'TypeA'的所有记录更新为1。 Name中的Settings列。
  • 来自table A的{​​{1}}列的值为Type,然后将两个表中具有相同table B的所有记录更新为2 'TypeB'中的Name列。
  • Settings的{​​{1}}列同时具有table AType的值,然后更新所有具有相同{{1} },从table B'TypeA'列的3。

'TypeB'的结果应如下所示:

Name

我该怎么办?

2 个答案:

答案 0 :(得分: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 :(得分: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

上的测试