如何在SQL视图中对Invoice ID列进行唯一值过滤?
解决SQL视图中Invoice ID重复的问题
为什么DISTINCT没用?
DISTINCT是对整行所有列做去重判断,只要其他列(比如金额、创建时间)有任何差异,哪怕Invoice ID相同,整行也会被判定为不同记录保留下来,这就是你用了DISTINCT却没去掉重复Invoice ID的核心原因。
具体解决方案
只保留唯一Invoice ID(无需其他列)
如果视图只需要Invoice ID的唯一值,直接只查询这一列就行,两种写法都可以:-- 写法1:用DISTINCT SELECT DISTINCT InvoiceID FROM 你的视图基表或原视图; -- 写法2:用GROUP BY SELECT InvoiceID FROM 你的视图基表或原视图 GROUP BY InvoiceID;需要保留其他列时筛选唯一行
如果还要保留Invoice ID对应的其他列数据,得明确指定保留重复ID中的哪一行(比如最新创建的、金额最大的),用窗口函数ROW_NUMBER()是最灵活的方式:WITH RankedInvoices AS ( SELECT *, -- 按Invoice ID分组,每组内按创建时间倒序排序,给行打序号 ROW_NUMBER() OVER (PARTITION BY InvoiceID ORDER BY 创建时间 DESC) AS rn FROM 你的视图基表或原视图 ) -- 只取每组序号为1的行(也就是最新的那一行) SELECT * FROM RankedInvoices WHERE rn = 1;把
ORDER BY 创建时间 DESC换成你需要的逻辑就行,比如ORDER BY Amount DESC取金额最大的行,或者其他业务相关的列。检查视图的关联逻辑
如果你的视图是多表JOIN出来的重复,大概率是关联条件不严谨导致了笛卡尔积(比如一对多关联时没限制好关联字段),得核对JOIN的条件是否正确,避免不必要的行倍增。
内容的提问来源于stack exchange,提问作者Stady
相关产品推荐
相关产品推荐

