2016-11-10 6 views
1

В Postgres У меня есть 3 таблицы, которые соединены двумя ключами:значения обновления в колонке на основе сравнения двух других таблиц

ключ A соединяет таблицы 1 и 2, не является уникальным в таблице 1, является уникальным в таблице 2 и не существует в таблице 3

Key B соединяет таблицы 2 и 3 не существует в таблице 1 и является уникальным в таблицах 2 и 3.


Я ищу, чтобы обновить столбец в таблице 3, которая должна содержать количество записей в таблице 1 (все значения в этом столбце равны 0).

Table_1

+-----+ 
| Key | 
+-----+ 
| A1 | 
| A1 | 
| A1 | 
| A2 | 
| A2 | 
| A3 | 
| A3 | 
+-----+ 

Table_2

+-------+-------+ 
| Key_A | Key_B | 
+-------+-------+ 
| A1 | B1 | 
| A2 | B2 | 
| A3 | B3 | 
+-------+-------+ 

Table_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

Избегайте дорогой коррелировала подзапрос:

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 является внешним ключом к table_3, так что не надо присоединиться table_3 в пункте from.

create table t2 (a int primary key, b int unique); 
create table t1 (a int references t2); 
create table t3 (b int unique references t2, c int); 

insert into t2 (a, b) values (1,1),(2,2),(3,3); 
insert into t1 (a) values (1),(1),(1),(2),(2),(3),(3); 
insert into t3 (b) values (1),(2),(3); 
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 
       ); 

После рассмотрения вопроса, я понимаю, что это не случай, но я предлагаю решение в любом случае.

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 
Смежные вопросы