为了账号安全,请及时绑定邮箱和手机立即绑定

如何(或可以)在多列上选择DISTISTION?

如何(或可以)在多列上选择DISTISTION?

森林海 2019-06-19 17:10:56
如何(或可以)在多列上选择DISTISTION?我需要从一个表中检索所有行,其中两个列的合并都是不同的。因此,我希望所有的销售,没有任何其他销售发生在同一天,以相同的价格。基于日和价格的独特销售将被更新到活动状态。所以我在想:UPDATE salesSET status = 'ACTIVE'WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)              FROM sales             HAVING count = 1)但我的大脑会痛得更厉害。
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

SELECT DISTINCT a,b,c FROM t

粗略相当于:

SELECT a,b,c FROM t GROUP BY a,b,c

通过语法习惯这个组是个好主意,因为它更强大。

对于您的查询,我会这样做:

UPDATE salesSET status='ACTIVE'WHERE id IN(
    SELECT id    FROM sales S    INNER JOIN
    (
        SELECT saleprice, saledate        FROM sales        GROUP BY saleprice, saledate        HAVING COUNT(*) = 1 
    ) T    ON S.saleprice=T.saleprice AND s.saledate=T.saledate )


查看完整回答
反对 回复 2019-06-19
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

查询的问题是,当使用GROUP BY子句(本质上是使用DISTION)时,您只能使用按组分组的列或聚合函数。不能使用列id,因为可能存在不同的值。在您的例子中,由于HAVING子句,总是只有一个值,但是大多数RDBMS不够聪明,无法识别它。

但是,这应该有效(不需要联接):

UPDATE salesSET status='ACTIVE'WHERE id IN (
  SELECT MIN(id) FROM sales  GROUP BY saleprice, saledate  HAVING COUNT(id) = 1)

您也可以使用MAX或AVG代替MIN,只有在只有一个匹配行的情况下才能使用返回列值的函数。


查看完整回答
反对 回复 2019-06-19
  • 3 回答
  • 0 关注
  • 520 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信