使用PostgreSQL使用自己的行更新SQL表

使用PostgreSQL使用自己的行更新SQL表,sql,postgresql,Sql,Postgresql,我想尝试用postgresql表自己的值更新它 此表包含按年份和月份销售的产品概述 CREATE TABLE sales ( sector character(3), brand character(4), product character(16), syear integer, smonth integer, units_sold integer, units_sold_year integer, CONSTRAINT pk_sales_id PRIMARY

我想尝试用postgresql表自己的值更新它

此表包含按年份和月份销售的产品概述

CREATE TABLE sales
(
  sector character(3),
  brand character(4),
  product character(16),
  syear integer,
  smonth integer,
  units_sold integer,
  units_sold_year integer,
  CONSTRAINT pk_sales_id PRIMARY KEY (sector, brand, product, syear, smonth)
);

INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('1', 'ABE', '71012', 2010, 0, 9, 0); /* The month 0 is the whole year */
INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('1', 'ABE', '71012', 2010, 1, 4, 0);
INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('1', 'ABE', '71012', 2010, 2, 5, 0);
INSERT INTO sales(sector, brand, product, syear, smonth, units_sold, units_sold_year) VALUES ('ALL', 'ABE', '71012', 2010, 0, 9, 10);
...
我添加了“units\u Sald\u year”列,因为我需要能够在这个表上快速执行请求(否则我必须执行子查询),我正在尝试填充它

以下是我到目前为止构建的更新请求,但它似乎在无限循环中运行:

UPDATE sales set units_sold_year = (SELECT units_sold_year FROM sales as s WHERE sector = 'ALL' and s.smonth = 0 and s.brand = su.brand and s.product = su.product and s.syear = su.syear)
FROM sales su
where su.syear = 2010
and su.brand = 'ABE' and su.product = '71012';
是否可以像这样用自己的行更新表?

您的查询看起来不错(即使我不同意要求)

不过,我会更改子查询的顺序,以匹配主键索引。我相信有了这样一个复合索引,博士后将按照索引的顺序进行评估

所以你的PK指数

(行业、品牌、产品、系统、, 斯蒙特)

及 您的子查询应为:

…其中扇区=‘全部’和s.brand= su.品牌和s.产品=su.产品 s.syear=su.syear和s.smonth= 0

对于复合索引,顺序对查询很重要

如果列(col0、col1、col2)上有一个复合索引,则此索引将有助于执行以下操作的查询:

select * from tablex where col0 = a
select * from tablex where col0 = a and col1 = b
select * from tablex where col0 = a and col1 = b and col2 = c
但它不会用于以下情况的查询:

select * from tablex where col1=b and col2=c

因此,在(col0)、(col0,col1)和(col0,col1,col2)上创建索引是多余的(可能会影响性能)。

其余答案都很好,但我注意到一件事,您使用的是char(n)。一般来说,这是一种不好的数据类型,因为它会累加。请考虑使用VARCHAR。

是的,这是完全可能的,我想你已经很好地解决了这个问题。SALES表中有多少行,有哪些索引?INSERT语句已断开-缺少列units_SALLED,但传递了一个值(6列,7个值)。此外,“产品”(字符(4))的值太长-它们是5个字符。如果您要发布代码,请确保它有效!对不起,我的错误(编辑),我在这里编了一个简化版。我有460115行的销售记录。我有两个索引:使用btree创建索引idx\u section\u brand\u product\u syear ON sales(section NULLS FIRST,brand NULLS FIRST,product NULLS FIRST,syear NULLS FIRST);使用btree创建销售索引idx\u sector\u brand\u product\u syear\u smonth(sector NULLS FIRST,brand NULLS FIRST,product NULLS FIRST,syear NULLS FIRST,smonth NULLS FIRST);主键约束会创建一个隐式索引,因此您创建的另外两个索引是冗余的,可能只是导致性能问题。另一方面,您的第一个索引(idx\U sector\U brand\U product\U syear)是不必要的,因为您的第二个索引(ids\U sector\U brand\U product\U syear\U smonth)是一个超集。是的,关于Postgres中综合索引的进一步解释。。。您的综合索引(部门、品牌、产品、syear、smonth)将用于查询“部门”、“部门、品牌”、“部门、品牌、产品”都将使用该索引的位置。但是,如果您要查询“部门、产品、品牌”的位置(注意顺序与索引不同?),则不会使用综合索引。您的意思是我应该更改位置的顺序以使综合索引受益?你的PK似乎是一样的,我是不是遗漏了什么?谢谢!你能详细解释一下为什么你“不同意这个要求”吗?你将如何改进我当前的设置?当然。我加上这个小小的警告,只是因为我认为一个不公平的答案是说“这是一个愚蠢的想法”。最好只回答这个问题:)为什么我不同意这个要求?嗯,听起来这个“销售”表应该只代表纯销售。将这些值聚合成某种可报告的数据不应使其下面的原始数据变得混乱。它是易碎的。最好创建一个单独的数据视图,或者将其作为一个报告查询。好的,谢谢,这是公平的,如果有任何变化,这个设计确实是脆弱的。这个“sales”表的存在只是为了生成统计数据,这些数据必须产生超快速的结果,现在用户可以创建具有即时显示功能的小型自定义查询。什么叫“报告查询”?