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

时间:2019-03-29 07:24:57

标签: sql sql-server tsql sql-update

我有一个table A,其中有2个主要列:NameSettingsSettings列将具有3个值:1、2或3。

例如:

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

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

我还有另一个table B,其中有两列:NameTypeType列包含3个值:'TypeA''TypeB''TypeC'

例如:

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

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

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

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

table A的结果将如下所示:

table A

3 个答案:

答案 0 :(得分:2)

听起来像您需要一条更新联接语句:

UPDATE a
SET    settings = CASE type WHEN 'TypeA' THEN 1
                            WHEN 'TypeB' THEN 2
                  END
FROM   tablsA a
JOIN   tableB b ON a.name = b.name
WHERE  type IN ('TypeA', 'TypeB') -- just a precaution

答案 1 :(得分:0)

在这种情况下,我看到了多个选项。

您可以考虑将这些表标准化,并在级联更新时添加外键。

您可以仅替换视图中的一个表并映射值;这取决于可以更新哪个表。如果两个都收到更新,则此解决方案仅在使用索引视图时才有效。

如果您在不同类型上具有不同或重叠的设置(也可能具有用户的依赖性),则可能需要一个映射表,将类型映射到设置。

也可以在这些内容中使用触发器来确保一致性,但是您应该选择具有正确外键的正确表格布局。

这也可能有助于提供有关您的用例的更多详细信息。

答案 2 :(得分:0)

一种方法是在JOIN之前聚合第二张表:

UPDATE a
    SET settings = (CASE WHEN num_a > 0 AND num_b = 0 THEN 1
                         WHEN num_b > 0 THEN 2
                         ELSE 3
                    END)
FROM tablsA a JOIN
     (SELECT b.name,
             SUM(CASE WHEN type = 'TypeA' THEN 1 ELSE 0 END) as num_a,
             SUM(CASE WHEN type = 'TypeB' THEN 1 ELSE 0 END) as num_B
      FROM tableB b
      GROUP BY b.name
     ) b
     ON a.name = b.name