我有一个table A
,其中有2个主要列:Name
和Settings
。
Settings
列将具有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
,其中有两列:Name
和Type
。
Type
列包含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
,而只考虑TypeA
和TypeB
。
现在,我想使用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} },从Name
到Settings
列的3。 table A
的结果将如下所示:
table A
答案 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