2

我有 2 个具有以下结构的表:

表 1 (Tb1):

MasId Int, ItemId int, Quantity int
1          1           10
1          2           5
1          3           18
2          2           3
2          4           8

表 2 (Tb2):

MasId Int, ItemId int, Quantity int
10          1           10
10          2           5
10          3           18
6           2           3
6           4           8

我想将 Tb1 与 Tb2 与ItemIdQuantity列相匹配。并获得以下查询:

Tb1.MasId   Tb2.MasId
1           10
2           6

表 1 和表 2 包含大约 2000000 条记录。我用SQL Server 2012

编辑 1

在 Tb1 和 Tb2 中存在如下记录:

结核病1:

MasId, ItemId, Quantity
3      15       10
3      16       2

结核病:

MasId, ItemId, Quantity
20     15      10
20     18      5

Tb1.MasId 和 Tb2.MasId 不匹配在一起。

4

3 回答 3

1

以下作为 SqlFiddle 可用的查询即使使用棘手的数据也会返回正确的结果:

SELECT
   Tb1MasId = A1.MasId,
   Tb2MasId = B1.MasId
FROM
   (
      SELECT
         MasID,
         Pattern = Checksum_Agg(Binary_Checksum(ItemId, Quantity))
      FROM dbo.Tb1
      GROUP BY MasId
   ) A1
   INNER JOIN (
      SELECT
         MasID,
         Pattern = Checksum_Agg(Binary_Checksum(ItemId, Quantity))
      FROM dbo.Tb2
      GROUP BY MasId
   ) B1
      ON A1.Pattern = B1.Pattern
      AND NOT EXISTS (
         SELECT * 
         FROM
            (
               SELECT A2.ItemID, A2.Quantity
               FROM dbo.Tb1 A2
               WHERE A1.MasID = A2.MasID
               UNION ALL
               SELECT B2.ItemID, B2.Quantity
               FROM dbo.Tb2 B2
               WHERE B1.MasId = B2.MasID
            ) X
         GROUP BY ItemID, Quantity
         HAVING Count(*) = 1
      );

页面上的其他答案使用我的 SqlFiddle中的示例数据给出了不正确的结果。具体来说,添加以下数据Tb2将破坏XLAnt 的当前查询2, 8(由于未检测到8, 3, 18不属于,这将显示错误匹配)。

INSERT dbo.Tb2
VALUES
   (7, 1, 10),
   (7, 2, 5),
   (7, 3, 17),
   (8, 3, 18),
   (8, 2, 3),
   (8, 4, 8);
于 2012-12-31T09:16:43.737 回答
0

尝试 :

SELECT Tb1.MasId AS MasId1, Tb2.MasId AS MasId2
FROM Tb1, Tb2, (SELECT MasId, COUNT(MasId) AS Cnt FROM Tb1 GROUP BY MasId) Cnt
WHERE Tb1.ItemId = Tb2.ItemId
  AND Tb1.Quantity = Tb2.Quantity
  AND Tb1.MasId = Cnt.MasId
GROUP BY Tb1.MasId, Tb2.MasId, Cnt.Cnt
HAVING COUNT(Tb1.MasId) = Cnt.Cnt

请参阅SQLFiddle

于 2012-12-20T08:38:13.963 回答
0

你也可以像下面这样分组

SELECT Tb1.MasId, Tb2.MasId
       FROM Tb1 
          INNER JOIN Tb2 
             ON Tb1.ItemId = Tb2.ItemId
             AND Tb1.Quantity = Tb2.Quantity
 group by Tb1.MasId, Tb2.MasId
于 2012-12-20T08:53:13.647 回答