在postgres中我有3个表由两个键连接:
Key A连接表1和2,在表1中不是唯一的,在表2中是唯一的,在表3中不存在
表1中不存在键B连接表2和3,并且在表2和表3中是唯一的。
我希望更新表3中应该保存表1中记录数的列(该列中的所有值都是0)。
TABLE_1
+-----+
| Key |
+-----+
| A1 |
| A1 |
| A1 |
| A2 |
| A2 |
| A3 |
| A3 |
+-----+
表_2。
+-------+-------+
| Key_A | Key_B |
+-------+-------+
| A1 | B1 |
| A2 | B2 |
| A3 | B3 |
+-------+-------+
表_3(期望的结果)
+-------+--------+
| Key_B | Count |
+-------+--------+
| B1 | 3 |
| B2 | 2 |
| B3 | 2 |
+-------+--------+
我坚持使用更新命令(对它们还不够熟悉),我已经得到了我需要的计数:
Select Table_3.Key_B, count(Table_1.*)
from Table_1
Join Table_2 on Table_1.Key_A = Table_2.Key_A
Join Table_3 on Table_2.Key_B = Table 3.Key_B
Group by 1
我只是不太确定如何使用正确的计数更新表3中的记录。我想我可能需要一个功能,但我不确定。这是在正确的轨道上吗?
Create or replace function my_funct
returns varchar as
$body$
Declare
r record
begin
select key_B from Table_3 into r;
update Table_3
set count = (
select count(*)
from table_1
Join Table_2 on Table_1.Key_A = Table_2.Key_A
Join Table_3 on Table_2.Key_B = Table 3.Key_B
Where key_B = r
);
end
$body$
答案 0 :(得分:0)
子查询中需要关联条件:
update Table_3
set count = (select count(*)
from table_1 t1 join
table_2 t2
on t1.Key_A = t2.Key_A
where t2.Key_B = Table_3.Key_B
);
Table_3
的引用来自外部查询。
实际上,您甚至不需要join
,假设Table_1
和Table_2
之间存在正确的外键关系,并且Table_1
没有重复项:
update Table_3
set count = (select count(*)
from table_2 t2
where t2.Key_B = Table_3.Key_B
);
在回顾完问题之后,我意识到情况并非如此,但无论如何我都提供了解决方案。
答案 1 :(得分:0)
避免昂贵的相关子查询:
update t3
set c = t.c
from (
select t2.b, count(*) as c
from t1 join t2 on t1.a = t2.a
group by 1
) t
where t3.b = t.b
;
table t3;
b | c
---+---
1 | 3
2 | 2
3 | 2
据我所知key_B
中的table_2
是[{1}}的外键,因此无需在table_3
子句中加入table_3
。
from
答案 2 :(得分:0)
UPDATE #table3 SET _Count = Cnt FROM (SELECT COUNT(*) Cnt,#table1.Key_A,Key_B KeyB FROM #table1 JOIN #table2 ON #table1.Key_A = #table2.Key_A GROUP BY #table1.Key_A,Key_B ) A WHERE KeyB = Key_B