我有一个table A
,其中有2个主要列:Name
和Settings
。
Settings
列将具有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
,其中有两列:Name
和Type
。
Type
列包含许多值,例如:'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
。 我们只考虑考虑TypeA
和TypeB
。
现在,我想使用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 A
和Type
的值,然后更新所有具有相同{{1} },从table B
到'TypeA'
列的3。 'TypeB'
的结果应如下所示:
Name
我该怎么办?
答案 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
上的测试