猿问

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

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

我需要从一个表中检索所有行,其中两个列的合并都是不同的。因此,我希望所有的销售,没有任何其他销售发生在同一天,以相同的价格。基于日和价格的独特销售将被更新到活动状态。

所以我在想:

UPDATE salesSET status = 'ACTIVE'WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)
             FROM sales             HAVING count = 1)

但我的大脑会痛得更厉害。


森林海
浏览 521回答 3
3回答

眼眸繁星

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 )

慕桂英3389331

查询的问题是,当使用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,只有在只有一个匹配行的情况下才能使用返回列值的函数。
随时随地看视频慕课网APP
我要回答