【问题标题】:How to update a column from a table base on another column's value from another table如何根据另一个表中另一列的值更新表中的列
【发布时间】:2019-03-31 13:44:23
【问题描述】:

我有一个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,有 2 个主要列: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

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

  • table B 中的Type 列的值为'TypeA',然后将两个表中具有相同Name 的所有记录更新为table ASettings 列上的1 @。
  • table B 中的Type 列的值为'TypeB',然后将两个表中具有相同Name 的所有记录更新为来自@987654355 的Settings 列上的2 @。
  • table B 中的Type 列同时具有'TypeA''TypeB' 的值,然后将两个表中具有相同Name 的所有记录更新为@ 上的3 987654361@ 列来自table A

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

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

我该怎么做?

【问题讨论】:

    标签: sql sql-server tsql sql-update


    【解决方案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和你的样本数据中,这里是UPDATE执行后TableA的内容:

    姓名 |设置 :-------- | --------: 安德烈 | 1 安德烈 | 1 贝蒂 | 2 查尔斯 | 3 查尔斯 | 3

    【讨论】:

    • 嗨,我已经用我的真实数据对其进行了测试,它似乎符合我的预期。非常感谢!!
    • @VũTrần 你现在应该删除其他重复的问题,因为你终于得到了你想要的。
    【解决方案2】:

    更新可以加入一个子查询,该查询根据 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

    【讨论】:

      猜你喜欢
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多