sql—枚举(给出名称)两个或多个表的交叉连接的记录

hmmo2u0o  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(279)

我需要为使用SQLServer的两个表(两个集)的交叉连接(交叉乘积)产生的任何单行指定唯一标识符。基本上,我需要将结果集任何一行的列值“压缩”到一个唯一标识符中。我在想一个guid方法或类似的方法,但我不确定它是否能达到目的。什么方法对sqlsserver有效?此机制的目的是评估不同集合(表)的成员(行)的所有可能组合,并为以后使用所需的任何组合指定唯一名称。
例子

Input Tables A and B

+----+----+   +----+----+
| Table A |   | Table B |
+----+----+   +----+----+
| A1 | A2 |   | B1 | B2 |
+----+----+   +----+----+
|  1 |  2 |   | a  |  b |
|  3 |  4 |   | c  |  d |
+----+----+   +----+----+

结果集表a x b+唯一标识符

+----+----+----+----+ +-----+
| A1 | A2 | B1 | B2 | | UID |
+----+----+----+----+ +-----+
|  1 |  2 | a  |  b | | 001 |
|  1 |  2 | c  |  d | | 002 |
|  3 |  4 | a  |  b | | 003 |
|  3 |  4 | c  |  d | | 004 |
+----+----+----+----+ +-----+
yqyhoc1h

yqyhoc1h1#

一种选择是使用 row_number() :

select
    a.a1,
    a.a2,
    b.b1,
    b.b2,
    row_number() over(order by a.a1, a.a2, b.b1, b.b2) uid
from a
cross join b
vaqhlq81

vaqhlq812#

如果需要一个随时间变化而一致的唯一标识符,请将表中的两个标识符组合起来:

concat(a1, ':', b1)

这是假设 a1 以及 b1 是主键。
如果没有主键,请添加一个。这将促进你想做的事情。
您可以冒险使用哈希函数。像这样:

select concat(convert(varchar(32), hashbytes('MD5', concat(a1, ':', a2), 2), ':',
              convert(varchar(32), hashbytes('MD5', concat(b1, ':', b2), 2)
             )

这会有冲突的风险(哈希值是相同的,即使基础值不相同),但这是相当低的。这是一个使用主键的参数。

相关问题