Tsql 针对MD5 varbinary值的聚合或其他特殊计算函数

Tsql 针对MD5 varbinary值的聚合或其他特殊计算函数,tsql,sql-server-2012,md5,Tsql,Sql Server 2012,Md5,我有一个很长的自然键,在化学应用程序中有数百个字符。我可以对该值使用MD5来创建一个伪自然键。我想知道的是,以下是否可行;考虑两组子行: ParentTable parent1 parent2 ChildTable parent1....md5 value a parent1....md5 value b parent1....md5 value c parent2....md5

我有一个很长的自然键,在化学应用程序中有数百个字符。我可以对该值使用MD5来创建一个伪自然键。我想知道的是,以下是否可行;考虑两组子行:

       ParentTable
       parent1
       parent2

       ChildTable
       parent1....md5 value a
       parent1....md5 value b
       parent1....md5 value c

       parent2....md5 value b
       parent2....md5 value c
       parent2....md5 value a
是否可以计算每个三行md5值集,并将计算出的值相互比较,以确定parent1和parent2是否具有相同的子集?孩子们的顺序不一样,但在任何情况下都没有顺序——这三个元组实际上只是一袋行

所以问题可能是,parent1和parent2在各自的袋子里有相同的东西吗

再说一次,说清楚点,我希望避免一排一排地比较一组和另一组。理想情况下,我希望找到类似于从ChildTable中选择summd5的东西,其中parent=1

编辑:在子表上会有一个唯一的索引,以防止同一父表的相同值出现多次:在ChildTableparent上创建唯一索引UX_CHILDTABLE,md5


EDIT2:将袋子与袋子进行比较时,相同或相等的定义为:它们包含相同的MD5值集,即一个袋子中的每个项目在另一个袋子中都有它的孪生项。bag1的所有实体都在bag2中找到,bag2的所有实体都在bag1中找到。

我对您的答案有一个可能的解决方案,但这取决于一些澄清。因为我是一个新用户,所以我没有能力在评论中提问。您声明有与每个父级对应的行包。据我所知,行李可能有重复的物品。如果您的父母中存在重复的M5S,您想只考虑不同的吗?第二,您是否仅在袋A=袋B或袋A是袋B的子集,反之亦然的情况下寻求相等

我提出了一个解决方案,考虑到平等关系,它只寻找不同的MD5:

假设我们有两个聚合在子表中的父表,如您的示例所示:

--Create tables that hold our data
if object_id('tempdb..#parent1') is not null drop table #parent1
create table #parent1 (parent varchar(20), words varchar(20), chem varchar(100), bHash varchar(34))
insert into #parent1 values ('parent 1', 'this', 'a', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'a'))))
insert into #parent1 values ('parent 1', 'does', 'b', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'b'))))
insert into #parent1 values ('parent 1', 'not', 'c', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'c'))))

if object_id('tempdb..#parent2') is not null drop table #parent2
create table #parent2 (parent varchar(20), words varchar(20), chem varchar(100), bHash varchar(34))
insert into #parent2 values ('parent 2', 'matter', 'b', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'b'))))
insert into #parent2 values ('parent 2', 'just', 'c', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'c'))))
insert into #parent2 values ('parent 2', 'words', 'a', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'a'))))
insert into #parent2 values ('parent 2', 'duplicate', 'a', upper(sys.fn_sqlvarbasetostr(hashbytes('md5', 'a'))))

if object_id('tempdb..#child') is not null drop table #child
select *
into #child
from #parent1
union all
select * from #parent2
通过将MD5值视为字符串,我们可以将MD5的行值连接到单个有序列表中。在连接之后,我们可以生成一个新的MD5散列,该散列应用于父级的唯一值集合

if object_id('tempdb..#parentHash') is not null drop table #parentHash
select distinct parent
      --We can create a new hash off an ordered list of distinct values (this is the list)
      ,stuff((select ','+o.bHash
             from (select distinct parent, bHash from #child) o
             where o.parent = t.parent
             order by o.bHash
             for xml path('')),1,1,'') ordered_list
      --Create the hash
      ,upper(sys.fn_sqlvarbasetostr(hashbytes('md5',
           stuff((select ','+o.bHash
                 from (select distinct parent, bHash from #child) o
                 where o.parent = t.parent
                 order by o.bHash
                 for xml path('')),1,1,'')
       ))) parentHash
into #parentHash
from (select distinct parent, bHash from #child) t
然后,您可以在父哈希相等的位置查询这些值

select distinct o.parent
      ,t.parent
from #parentHash o
inner join #parentHash t on o.parentHash = t.parentHash and o.parent <> t.parent

同样,此解决方案假定您只查找具有等效唯一值的行李。如果您担心重复项或父项是彼此的子集,则必须探索不同的解决方案。

感谢您的回复。我现在正在通读并编辑我的原始问题,以回答您的后续问题。我们可以通过将MD5值视为字符串,将MD5的行值连接到单个有序列表中。在连接之后,我们可以生成一个新的MD5散列,该散列应用于父级的唯一值集合。很好,我刚刚想到了一种字符串连接方法,并准备发布一个关于XML路径的问题:-