根据两个其他表的比较更新列中的值

时间:2016-11-10 17:48:17

标签: sql postgresql sql-function

在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$

3 个答案:

答案 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_1Table_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