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

时间:2020-03-05 18:50:49  来源:igfitidea点击:

我需要从合并了2列的表中检索所有行。因此,我希望所有在同一天以相同价格进行的销售都没有其他任何销售。基于日期和价格的唯一销售将更新为活动状态。

所以我在想:

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

但是我的大脑比这更痛。

解决方案

回答

SELECT DISTINCT a,b,c FROM t

大致相当于:

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

习惯GROUP BY语法是一个好主意,因为它功能更强大。

对于查询,我会这样做:

UPDATE sales
SET 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
 )

回答

查询的问题在于,当使用GROUP BY子句时(本质上是通过使用distinct来完成的),我们只能使用按功能分组或者聚集功能的列。我们不能使用列ID,因为可能存在不同的值。在情况下,由于HAVING子句,始终只有一个值,但是大多数RDBMS不够聪明,无法识别该值。

但是,这应该可以工作(并且不需要联接):

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

我们也可以使用MAX或者AVG代替MIN,只有只有一个匹配的行时,使用返回列值的函数才是重要的。