如何在 SQL 中使用下一个值表达式时使用 DISTINCT

问题描述 投票:0回答:1

我有一个查询,它使用 Next Value For 生成唯一 ID,其余列是您常用的引用、名称和类型等。我遇到的问题是 Next Value For 生成重复行 - 当我尝试使用 SELECT DISTINCT 我收到以下错误;

NEXT VALUE FOR 函数不能直接在使用 DISTINCT、UNION、UNION ALL、EXCEPT 或 INTERSECT 运算符的语句中使用。

当我注释掉第一个“下一个值”列时,重复项将被删除,并且我得到正确的结果,即唯一的行,但是当“下一个值”未注释掉时,将返回重复项。我知道我可以对每一列使用 Group By,但有近 50 列,并且希望有一种更清晰的方法来保留 ID 列(使用 Next Value For)但只返回唯一行。以下是示例;

SELECT DISTINCT
CONVERT(VARCHAR(100), 333000000000000 + NEXT VALUE FOR[UnitE].CAPS_ID OVER(ORDER BY modudet.code, CONCAT(CONCAT(concat(modudet.code, 'CM'), '-'),  '2024'))) AS 'ID'
, CONVERT(VARCHAR(255), progdetail.programmecode) AS 'PROGRAMME' 
, CONVERT(VARCHAR(50), CONCAT(CONCAT(concat(modudet.code, 'CM'), '-'),  '2024')) AS 'REFERENCE' 
, CONVERT(VARCHAR(255), modudet.longtitle) AS 'NAME' 
, CONVERT(VARCHAR(10),'Module') AS 'TYPE'
 FROM [TABLE1] progdetail 
 JOIN [TABLE2] modudet ON progdetail .child_entitycuid = modudet.module_cuid
WHERE progdetail.programmecode in (SELECT DISTINCT programmecode FROM TABLE2 GROUP BY programmecode HAVING COUNT(*)=1) 

任何指点将不胜感激。非常感谢。

更新:根据 Dale K 的建议,我尝试将 DISTINCT 放入子查询中,但它仍然产生相同的重复项。

sql-server t-sql sequence distinct nextval
1个回答
0
投票

您可以创建一个

view
来完成您的
CONVERT(VARCHAR(100), 333000000000000 + NEXT VALUE FOR[UnitE].CAPS_ID OVER(ORDER BY modudet.code, CONCAT(CONCAT(concat(modudet.code, 'CM'), '-'),  '2024'))) AS 'ID'
部分。此视图将选择此查询所需的所有列,并按您需要分组的所有字段进行分组。

您仍然可以对多列进行分组,但它将位于可重用的

view
中,并且您从中进行的查询将更加清晰。

或者,您可以从要分组的列中计算出哈希值(请参阅 https://dba.stackexchange.com/questions/220837/how-to-create-a-hash-compulated-column-for -多列)并按此哈希进行分组。

© www.soinside.com 2019 - 2024. All rights reserved.