Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:加入然后注释,而不是加入然后分组?_Sql_Postgresql - Fatal编程技术网

SQL:加入然后注释,而不是加入然后分组?

SQL:加入然后注释,而不是加入然后分组?,sql,postgresql,Sql,Postgresql,我在博士后9.4班工作。我有两个表,一个用于组织,主键字段为code: Table "public.org" Column | Type | Modifiers ---------------+------------------------+----------- code | character varying(6) | not null name | character va

我在博士后9.4班工作。我有两个表,一个用于组织,主键字段为
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上测试了它,它似乎起了作用。