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

ItemIdTb1 と Tb2 をand QuantityColumnsと一致させたいと考えています。以下のクエリを取得します。

Tb1.MasId   Tb2.MasId
1           10
2           6

Table1 と Table2 には、約 2000000 レコードが含まれています。そして私は使用しますSQL Server 2012

編集1

Tb1 と Tb2 には、次のようなレコードが存在します。

Tb1:

MasId, ItemId, Quantity
3      15       10
3      16       2

Tb2:

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のサンプル データで誤った結果が得られます。具体的には、次のデータを に追加すると、XLAnt の現在のクエリTb2が壊れます ( が属していないことが検出されないため、誤った一致が表示されます)。2, 88, 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 に答える