首页 > 解决方案 > SQL - 需要基于两个整数列的附加唯一标识符列的解决方案

问题描述

当我在 SELECT 语句中加入两个表时,我在结果集中的第 1 列中得到了一些重复项,如下所示:

|     ID1 |     ID2 |
|      12 |      34 |
|      12 |       4 |
|     123 |       1 |
|     123 |       4 |

但是 ID1、ID2 的组合在我的结果集中总是唯一的。

我需要有一个单独的列来唯一标识整个结果集,无论我何时执行选择,ID1、ID2 的每个组合都会产生相同的新标识符。我不允许使用临时表,显然像ROW_NUMBER ()这样的技巧在结果集上也不起作用,因为在两个表中的一些表得到更新后,它们可能会为 ID1、ID2 的相同组合生成不同的标识符。

我尝试了将 select 语句中的两个整数连接成一个整数的技术,如下所示:

SELECT ID1, ID2,
CAST(CONCAT(CAST(ID1 AS nvarchar(100)), CAST(ID2 AS nvarchar(100))) AS INT) AS Identifier

但它也不能解决问题,因为现在不同的组合可能会得到相同的标识符:

'12' + '34' = '1234'
'123' + '4' = '1234'

我需要有类似的东西:

|     ID1 |     ID2 | Identifier |
|      12 |      34 |          1 |
|      12 |       4 |          2 |
|     123 |       1 |          3 |
|     123 |       4 |          4 |

当其中一个表从另一个表中获得对应于 ID = 12 的新行时,之前定义的标识符将保持不变,如下所示:

|     ID1 |     ID2 | Identifier |
|      12 |      34 |          1 |
|      12 |       4 |          2 |
|      12 |       2 |        578 |
|     123 |       1 |          3 |
|     123 |       4 |          4 |

也就是说,无论何时执行 SELECT 语句,整数 ID1、ID2 的每个组合都会产生相同的新标识符。我将如何创建该标识符列以满足我的需求?

标签: sqlsql-serverinner-joinuniqueidentifier

解决方案


如果您事先知道这些整数的最大值,那么您可以使用算术。

假设它们的范围从 0 到 999,那么:

id1 * 1000 + id2 as identifier

推荐阅读