首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在表中插入一个唯一的键、几个列和子查询的和。

在表中插入一个唯一的键、几个列和子查询的和。
EN

Stack Overflow用户
提问于 2017-01-30 16:43:45
回答 2查看 50关注 0票数 3

我使用postgres,在DB迁移过程中,我有一个空表tableB,我想从另一个tableA中的数据中填充它。

tableB有以下列

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE contributors (
    id bigint NOT NULL,
    pps double precision NOT NULL,
    contributor_user_id bigint,
    project_id bigint
);

tableA有以下列

代码语言:javascript
代码运行次数:0
运行
复制
CREATE TABLE tableA (
    id bigint NOT NULL,
    assigned_ppoints double precision NOT NULL,
    state integer,
    contributor_id bigint,
    project_id bigint
);

所有的*_id实际上都是外键。

我需要在tableB上为contributor_idproject_id of tableA的现有组合添加一个新行,如下所示

  • project_id中,project_id of tableA
  • contributor_user_id,我需要contributor_id of tableA
  • pps中,我需要contributor_user_idproject_idassigned_ppointstableA中的state=2之和。

我的起点(而且非常遥远)是

代码语言:javascript
代码运行次数:0
运行
复制
INSERT INTO tableB (id, project_id, contributor_user_id, pps) 
SELECT MAX(id) FROM tableB, project_id, contributor_id, SUM(assigned_ppoints)
FROM tableA WHERE project_id=1 AND state=2 AND contributor_id=1;

这是错误的,并且只会添加与project_idcontributor_id的一个组合对应的一行。

我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-30 17:59:00

集料过滤器

代码语言:javascript
代码运行次数:0
运行
复制
select
    max(id),
    contributor_id,
    project_id,
    sum(assigned_ppoints) filter (where state = 2)
from t
group by 2,3

9.3及以前的版本:

代码语言:javascript
代码运行次数:0
运行
复制
select
    max(id),
    contributor_id,
    project_id,
    sum(assigned_ppoints * (state = 2)::integer)
from t
group by 2,3
票数 2
EN

Stack Overflow用户

发布于 2017-01-30 17:00:30

我建议采用这样的结构:

代码语言:javascript
代码运行次数:0
运行
复制
insert into A (...)
select
  something_B,
  another_B,
  (select something_C from C where ...) as subselect_C
from B
where ...
;

正如您现在看到的,您将对B的每个匹配行执行子查询。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41941089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档