我需要使用ControlViewModel
和ISSUES
变量来实现REFERENCE
列,每个行都有LOCALISATION
上存储的唯一值。
问题是,这两个变量构成了一个二维表,所以我必须动态选择Table_issues_Localisation
的右列。
以下是我需要对图像进行操作的说明。我很抱歉发布图片,但我认为这更容易理解。
我尝试进行查询以逐行更新LOCALISATION
列,其中包含Table_Observation.ISSUES
的变量列(= SELECT(SELECT))上的信息。
在Table_issues_Localisation
列上显示每行的数量。它用于循环。
Table_Observation.ROW_NUMBER
Postgres v 9.4
我希望我足够清楚,
答案 0 :(得分:2)
你不需要PL / pgSQL或循环。您可以使用单个更新语句执行此操作:
update observation o
set issues = row_to_json(il) ->> o.localisation
from issues_localisation il
where il.reference = o.reference;
这要求observation.localisation
中的值完全映射到issues_localisation中的列名。
使用以下测试数据:
create table observation
(
rn integer primary key,
reference integer,
localisation text,
issues text
);
create table issues_localisation
(
reference integer,
issues_12 text,
issues_17 text,
issues_27 text,
issues_34 text
);
insert into observation (rn, reference, localisation)
values
(1, 27568, 'issues_27'),
(2, 6492, 'issues_34'),
(3, 1529, 'issues_34'),
(4, 1529, 'issues_34'),
(5, 709, 'issues_12');
insert into issues_localisation (reference, issues_12, issues_17, issues_27, issues_34)
values
(29, 'FB', 'FB', 'TFB', null),
(506, 'M', null, 'M', null),
(709, 'TF', null, null, null),
(1234, null, 'TF', 'TF', null),
(1529, 'FB', 'FB', 'FB', 'M'),
(3548, null, 'M', null, null),
(6492, 'FB', 'FB', 'FB', null),
(18210, 'TFB', null, 'TFB', 'TFB'),
(27568, 'TF', null, 'TF', 'TF');
更新将导致表格观察中的这些数据:
rn | reference | localisation | issues
---+-----------+--------------+-------
1 | 27568 | issues_27 | TF
2 | 6492 | issues_34 |
3 | 1529 | issues_34 | M
4 | 1529 | issues_34 | M
5 | 709 | issues_12 | TF
在线示例:http://rextester.com/OCGFM81609
对于下一个问题,您应该按照我在答案中的方式提供样本数据(和预期输出)。
我也从表名中删除了完全没用的前缀table_
。那是horrible naming convention。
答案 1 :(得分:1)
这是动态sql的一个(未完成的,仍然需要执行)的例子:
CREATE FUNCTION bagger (_name text) RETURNS text
AS
$func$
DECLARE upd text;
BEGIN
upd := format('
UPDATE observation dst
SET issues = src.%I
FROM issues_localisation src
WHERE src.reference = dst.reference
AND dst.localisation = %L
;', _name, _name);
-- RAISE NOTICE upd;
RETURN upd;
END
$func$
LANGUAGE plpgsql
;
-- SELECT bagger('issues_12' );
WITH loc AS (
SELECT DISTINCT localisation AS loc
FROM observation
)
SELECT bagger( loc.loc)
FROM loc
;