如何(或者可以)在多列上选择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,只有只有一个匹配的行时,使用返回列值的函数才是重要的。