如何在多个列上选取不同的选项?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (29)

我需要检索一个表中所有的行,其中两个列的组合不同。我想要所有商品不管是销售还是没有销售的加个。然后基于当日和价格的销售量将一些商品设置为活动状态。

所以我想:

UPDATE sales
SET status = 'ACTIVE'
WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)
             FROM sales
             HAVING count = 1)
提问于
用户回答回答于

你可以:

UPDATE sales
SET    status = 'ACTIVE'
WHERE  (saleprice, saledate) IN (
    SELECT saleprice, saledate
    FROM   sales
    GROUP  BY saleprice, saledate
    HAVING count(*) = 1 
    );

这个要快得多。通过因子10 - 15(在PostgreSQL 8.4和9.1中进行测试)对当前语句的性能进行了分析。

但这不是最好的。可以用NOT EXISTSEXISTS是标准SQL语句,它至少从PostgreSQL 7.2开始,就已经存在了:

UPDATE sales s
SET    status = 'ACTIVE'
WHERE  NOT EXISTS (
   SELECT 1
   FROM   sales s1
   WHERE  s.saleprice = s1.saleprice
   AND    s.saledate  = s1.saledate
   AND    s.id <> s1.id                     -- except for row itself
   );
AND    s.status IS DISTINCT FROM 'ACTIVE';  -- avoid empty updates. see below

SQL Fiddle

标识行的唯一键

如果没有表的主键或唯一键(id(在本例中,您可以用系统列替换ctid为了这个查询的目的(但不是为了其他目的):

   AND    s.ctid <> s1.ctid

每个表都应该有一个主键。如果你还没有一个,就加一个吧。我建议serial或者IDENTITY在Postgres 10+。

怎么会更快?

可以发现控件中的子查询第一个dupe之后停止评估。对于几乎没有重复的基表,这只是稍微提高了效率。有了大量的重复,效率提高的更明显。

排除空更新

如果一些或多个行已经有status = 'ACTIVE',您的更新不会更改任何内容,但是仍然会以全部成本插入新的行版本(只适用轻微的例外情况)。通常,你不想这样。再加一个WHERE如上文所示,这样可以使这一过程更快:

如果status被定义NOT NULL,您可以简化为:

AND status <> 'ACTIVE';

热门问答

快照容量与费用的比例?如何关闭停用?

帅的惊动我国计算机大神
推荐已采纳
快照已于2019年1月22日0时启动正式商业化进程,商业化后所有存量快照和新产生的快照将根据快照使用的存储容量进行收费。 在快照商业化后,腾讯云仍旧会在国内主要地域为用户提供一定量的免费额度。免费额度策略如下: 免费额度覆盖范围为中国大陆地域,中国香港及海外地域暂无免费快照额...... 展开详请

红包消息如何构建?

红包消息的话,与@消息类似,可以通过 TIMCustomElem 来实现。需要应用在UI上做相应的特殊处理,比如检查到当前消息为红包消息后,消息展示为红包的样式。 另外,红包消息作为重要消息,最好在发送消息的时候将其设置为高优先级消息,以最大程序保证消息在触达频率限制的情况下仍可...... 展开详请

AVChatRoom和ChatRoom有什么区别?

面向的应用场景不同 ChatRoom适用于群组规模中等(不超过数千人级别)、成员进出不太频繁(每秒十几个人进出)的场景;AVChatRoom是专门为了大型直播设计的,适用于人数众多(万级以上)、成员进出频繁(每秒数百人以上进出)的场景。 AVChatRoom的优点 支持人数无上限...... 展开详请

serverless函数如何支持跨域?

解决跨域的方式有几种: 1. 如果不像自行解决跨域问题,且没有处理 http header 方法的问题,可以在 API 网关中,针对 API 配置,不选择 ANY 方法,而且仅选择非 header 的方法,然后勾选启用 CORS,由 API 网关协助解决跨域。完成配置后记得保存并...... 展开详请

调用短信接口返回错误?

您好,短信错误码文档:https://cloud.tencent.com/document/product/382/3771。 报错1021说明:请求发起时间不正常,通常是由于您的服务器时间与腾讯云服务器时间差异超过 10 分钟导致的 核查步骤: 1.请核查服务器时间是否正常; ...... 展开详请

对象存储数据三副本问题,谢谢 ?

波斯狗儿对象存储产品经理
推荐已采纳

1 COS 不完全使用副本的方式保存,数据调度能力属于我们的产品核心竞争力,具体实现方式一般不披露。

2 副本对用户是不感知的,COS 是一个最终一致性的存储,如果发起删除导致数据丢失,所有的数据都会被删除。

所属标签

扫码关注云+社区