xzzIntersect子行组

时间:2013-06-26 20:53:37

标签: sql sql-server

我必须根据现有数据获得“建议”的记录分组。

表A的复合键为Akey+Bkey。表B的主键为Bkey

Akey是从SQL 2012 Sequence对象生成的,表A和表之间存在一对多关系,Bkey上有表B.

结构和样本数据如下所列。

表A

Akey  Bkey  ItemSequence
----  ----  ------------
1     1     1
1     5     2
1     7     3
2     7     1
3     2     1
3     3     2

表B

Bkey  GroupValue       Data            HashString
----  ---------------  --------------  ----------
1     Ford Festiva     AIR BAG         HASH1
2     Ford Festiva     RADIATOR CAP    HASH2
3     Ford Festiva     FUEL PUMP       HASH3
4     Ford Mustang     AIR FILTER      HASH4
5     Ford Explorer    AIR FILTER      HASH5
6     Ford Edge        RADIATOR CAP    HASH2
7     Ford Edge        FUEL PUMP       HASH3

查询必须在表A中插入新组,以匹配表B中HASH值匹配的现有Bkeys集。为了描述该点,我使用汽车模型的示例。汽车模型中的项目的哈希值可以完全匹配(但它们可能不匹配)。因此,如果所有项目都存在于GroupValue之外,那么我想在表A中插入一组新记录,其中包含在该组中找到完全匹配的值。 在示例数据中,您可以看到AKey 3具有BKeys 2和3,Bkeys 6和7是匹配的,因此这2条记录将插入到表A中,并为AKey生成新的序列#。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解有关groups和GroupValue字段的部分。

根据我的理解,你想在表A中插入表B中与每个AKey的Bkey的HashString匹配的任何行,而表A中是否已经存在?

如果我理解正确:对于Akey1,行TableB.Bkey 7应该添加到表A.是吗?

如果逻辑良好,则以下查询应选择这些行。

SELECT 
    a.Akey, a.Bkey, b3.* 
FROM b 
    INNER JOIN a ON a.Bkey=b.Bkey 
    INNER JOIN b b2 ON b2.HashString=b.HashString and b2.Bkey=a.Bkey
    INNER JOIN b b3 ON b3.HashString=b2.HashString AND b3.Bkey <> b.Bkey 
WHERE a.Akey=3 --Comment this line for the full matches