我有一个查询,它使用 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 放入子查询中,但它仍然产生相同的重复项。
您可以创建一个
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 -多列)并按此哈希进行分组。