2013-10-08 46 views
0

在化學應用中,我有很長的自然鍵(數百個字符)。我可以使用MD5來創建一個ersatz自然鍵。我想知道的是以下是否可能;考慮子行的兩組:針對MD5 varbinary值的聚合或其他特殊計算功能

 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在他們各自的包裏有相同的東西嗎?

而且,爲了清楚起見,我希望避免必須逐一比較一組和另一組。理想情況下,我想找到類似於select sum(md5) from ChildTable where parent=1的東西。

編輯:會有子表上,以防止發生不止一次同父同值唯一索引:create unique index UX_CHILDTABLE on ChildTable(parent, md5);

EDIT2:「同一性」或「平等」時,袋子相比,包將被定義爲:它們包含相同的一組MD5值,即在一個包中的物品在另一個包中具有其雙胞胎。所有bag1的實體都在bag2中找到,bag2的所有實體都在bag1中找到。

回答

1

我對你的答案有一個潛在的解決方案,但它將取決於一些澄清。由於我是新用戶,因此我無法在評論中提出要求。你聲明你有與每個家長相對應的行「袋」。根據我的理解,行李可能有重複的物品。如果父母中存在重複的MD5,您是否只想考慮不同的MD5?其次,你是否只在袋子A =袋子B或者袋子A是袋子B的一個子集並且反之亦然時尋求平等?

我已經提出了一個解決方案,查找考慮的平等關係,只有不同的MD5s:

說我們有在一個子表彙總作爲例如兩個父表所示:

--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 

此外,此解決方案假定您只查找具有相同唯一值的行李。如果你擔心重複或父母是彼此的子集,不同的解決方案將不得不探索。

+0

感謝您的回覆。我現在正在閱讀並編輯我的原始問題,以回答您的後續問題。 – Tim

+0

'我們可以通過將MD5值視爲字符串來將MD5的行值連接成單個有序列表。連接後,我們可以生成一個新的MD5哈希,它適用於父級的唯一值集合。「很好,我只是通過字符串連接方法,並且即將發佈有關XML PATH的問題:-) – Tim