SQL:加入然后注释,而不是加入然后分组?
我在博士后9.4班工作。我有两个表,一个用于组织,主键字段为SQL:加入然后注释,而不是加入然后分组?,sql,postgresql,Sql,Postgresql,我在博士后9.4班工作。我有两个表,一个用于组织,主键字段为code: Table "public.org" Column | Type | Modifiers ---------------+------------------------+----------- code | character varying(6) | not null name | character va
code
:
Table "public.org"
Column | Type | Modifiers
---------------+------------------------+-----------
code | character varying(6) | not null
name | character varying(200) | not null
postcode | character varying(9) |
Indexes:
"org_pkey" PRIMARY KEY, btree (code)
一个用于按组织和月份列出的支出项目,外键返回到组织表:
Table "public.spending_item"
Column | Type | Modifiers
-------------------+-------------------------+--------------------------------------------------------------------
id | integer | not null default nextval('frontend_prescription_id_seq'::regclass)
actual_cost | double precision | not null
quantity | double precision | not null
processing_date | date | not null
org_id | character varying(6) | not null
Foreign-key constraints:
"fk_1234" FOREIGN KEY (org_id) REFERENCES org(code) DEFERRABLE INITIALLY DEFERRED
我想按组织按月查找总开支,以及组织名称和邮政编码
这是我当前的查询:
SELECT pr.org_id as org_id,
pc.name as org_name,
pc.postcode as org_postcode,
SUM(pr.actual_cost) AS cost
FROM spending_item pr
JOIN org pc ON pr.org_id=pc.code
GROUP BY org_id, org_name, org_postcode
然而,按照姓名、邮政编码以及代码进行分组似乎有些奇怪。考虑到对代码、名称和邮政编码没有“唯一在一起”的限制,只按代码分组似乎更安全。但是如果我从groupby
子句中删除org\u name
和org\u postcode
,那么我会得到一个错误
我想在实践中,因为代码是主键,所以这是可以的。但如果不是呢?我可能会冒为同一代码和月份创建多行的风险
从本质上说,我的问题是:是否有任何方式连接代码,然后才用名称和邮政编码注释输出?这样,如果同一代码有多个名称和邮政编码,我就会出错
这似乎比在所有三个字段上分组更安全,并且可能会意外地、不可见地为同一个月份和代码创建多行输出
还是我什么都不担心?您可以在
中选择或中使用子查询。当一个表中有很多列时,这非常方便。例如,以下内容将添加成本
,并将所有列保留在pc中
:
SELECT pc.*, pr.cost
FROM org pc JOIN
(SELECT pr.org_id, SUM(pr.actual_cost) as cost
FROM spending_item pr
GROUP BY pr.org_id
) pr
ON pr.org_id = pc.code ;
但是,请注意,如果将pc.code
定义为主键或唯一键,则还可以编写:
SELECT pc.*, SUM(pr.actual_cost) AS cost
FROM org pc JOIN
spending_item pr
ON pr.org_id = pc.code
GROUP BY pc.code;
这是ANSI标准语法,只有Postgres才完全支持。您不能只使用子选择,然后在子选择之外添加名称/代码吗?您的查询非常完美。请记住常规GROUP BY规则:“如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。”如果遵循此规则,以后就不会遇到问题。如果名称必须是唯一的,请使用唯一约束。也可以只使用大写或小写,以避免相同的名称以不同的方式书写。我不知道这个功能。我认为函数依赖关系在唯一列上还不能识别。原始提交,但当前(9.4)不包括它们。@posz。我刚刚在Postgres 9.3上测试了它,它似乎起了作用。