4

重複の可能性:
テーブルを使用したSQLクエリJOIN

これがTestingTable1のデータである場合

BUYER_ID  |   ITEM_ID       |  CREATED_TIME
----------+-----------------+----------------------
1345653      151851771618     2012-07-09 19:57:33
1345653      110909316904     2012-07-09 21:29:06
1345653      221065796761     2012-07-09 19:31:48

そして、これがTestingTable2の以下のデータである場合

USER_ID  |   PRODUCT_ID    |    LAST_TIME
---------+----------------+-----------------------
1345653     150851771618      2012-07-09 19:57:33
1345653     110909316904      2012-07-09 22:29:06
1345653     221165796761      2012-07-09 12:31:48

onとと比較する必要がTestingTable2あります。を確認する必要があります。一致する場合は、と比較する必要があります。一方または両方で比較した後に不一致がある場合は、結果を表示する必要があります。TestingTable1BUYER_IDUSER_IDBUYER_IDUSER_IDITEM_IDPRODUCT_IDCREATED_TIMELAST_TIMETestingTable2TestingTable1

したがって、上記の例を見ると、基本的に3つのシナリオがあります

  1. Firstly- In TestingTable1、の最初の行ITEM_IDはの最初の行と一致していませんPRODUCT_IDTestingTable2、両方のテーブルの最初の行CREATED_TIMEと一致していますLAST_TIME
  2. Secondly- In TestingTable1、2番目の行はの2番目の行とCREATED_TIME一致していませんが、両方のテーブルの2番目の行と一致していますLAST_TIMETestingTable2ITEM_IDPRODUCT_ID
  3. TestingTable13番目に-では、3番目の行ITEM_IDはと一致しておらず、またも一致していPRODUCT_IDないCREATED_TIMEためLAST_TIME、3番目の行では両方が3番目の行と一致していませんTestingTable1

したがって、これらは、常に比較TestingTable2しながらカバーする必要がある3つのケースです。TestingTable1またTestingTable1、これは常に比較を行う必要があるMAINテーブルであるため、データTestingTable1が常に正確であることを意味します。

したがって、上記の例を考慮して、これらのいずれかまたは両方のデータと一致しない場合は、同じデータTestingTable1の隣にこのような結果を表示する必要があります。これにより、TestingTable2TestingTable1TestingTable2

BUYER_ID   |   ITEM_ID       |    CREATED_TIME           |      USER_ID   |     PRODUCT_ID     |     LAST_TIME   
-----------+-----------------+---------------------------+----------------+--------------------+-----------------------
1345653        151851771618       2012-07-09 19:57:33           1345653        150851771618         2012-07-09 19:57:33
1345653        110909316904       2012-07-09 21:29:06           1345653        110909316904         2012-07-09 22:29:06
1345653        221065796761       2012-07-09 19:31:48           1345653        221165796761         2012-07-09 12:31:48

だから私はクエリを書きました、それは私の3つのシナリオすべてをカバーすると思いましたが、それだけがカバーしてFirst TwoいませんでしたThird One。そして、私はこの3番目のシナリオを達成できるかどうか混乱していますか?

SELECT * 
FROM(
    SELECT *
    FROM TestingTable1 A
    JOIN TestingTable2 B ON A.BUYER_ID = B.USER_ID AND B.LAST_TIME = A.Created_TIME 
    WHERE B.PRODUCTID <> A.ITEM_ID
    UNION ALL
    SELECT * 
    FROM TestingTable1 A
    INNER JOIN TestingTable2 B ON A.BUYER_ID = B.USER_ID AND B.PRODUCTID = A.ITEM_ID  
    WHERE B.t1time <> A.Created_TIME  
 ) X    

任意の提案をいただければ幸いです。

アップデート:-

私が最初にやろうと思っていたことを簡単に更新します。私は私の3番目のシナリオでいくつかの問題を知っていたので。

まず最初にTestingTable1、私はテーブルを並べ替え(ORDER BY)しBUYER_IDCREATED_TIME同じようTestingTable2に並べ替えています。また、データが特定の日に属していることを確認しUSER_IDLAST_TIME比較を行っています。BUYER_IDUSER_ID

4

4 に答える 4

1
with C as
(
  select *
  from TestingTable1 A
    inner join TestingTable2 B
      on A.BUYER_ID = B.USER_ID and
         B.LAST_TIME = A.Created_TIME and
         B.PRODUCT_ID <> A.ITEM_ID
  union all
  select * 
  from TestingTable1 A
    inner join TestingTable2 B 
      on A.BUYER_ID = B.USER_ID and 
         B.PRODUCT_ID = A.ITEM_ID and
         B.LAST_TIME <> A.CREATED_TIME
)
select *
from C
union all
select *
from TestingTable1 A
  inner join TestingTable2 B
    on A.BUYER_ID = B.USER_ID and
       A.CREATED_TIME <> B.LAST_TIME and
       A.ITEM_ID <> B.PRODUCT_ID
where not exists (select *
                  from C
                  where A.BUYER_ID = C.BUYER_ID and
                        A.ITEM_ID = C.ITEM_ID and
                        A.CREATED_TIME = C.CREATED_TIME) and
      not exists (select *
                  from C
                  where B.USER_ID = C.USER_ID and
                        B.PRODUCT_ID = C.PRODUCT_ID and
                        B.LAST_TIME = C.LAST_TIME);

SQLフィドル

于 2012-07-11T08:49:55.073 に答える
1

句を使用してnon exists、一方のテーブルで他方のテーブルで一致しない行を検索できます。これunionを他のテーブルに対して繰り返すことができます。

select  'missing in t2', *
from    TestingTable1 t1
where   not exists
        (
        select  *
        from    TestingTable2 t2
        where   t1.buyer_id = t2.user_id
                and t1.item_id = t2.product_id
                and t1.created_time = t2.last_time
        )
union all
select  'missing in t1', *
from    TestingTable2 t2
where   not exists
        (
        select  *
        from    TestingTable1 t1
        where   t1.buyer_id = t2.user_id
                and t1.item_id = t2.product_id
                and t1.created_time = t2.last_time
        )

SQLFiddleでの実例。

于 2012-07-11T08:43:18.503 に答える
0

最も近いのは、で一致しない可能性のあるすべての行と一致せTestingTable1ずに、のすべての行を一致させることです。TestingTable2TestingTable2

このように(テストされていませんが、うまくいけばあなたはアイデアを得るでしょう):

SELECT *
FROM TestingTable1 AS T1
INNER JOIN TestingTable2 AS T2 ON T1.BUYER_ID = T2.USER_ID
    AND
    (
        (
            (T1.ITEM_ID = T2.PRODUCT_ID AND T1.CREATED_TIME <> T2.LAST_TIME)
            OR (T1.ITEM_ID <> T2.PRODUCT_ID AND T1.CREATED_TIME = T2.LAST_TIME)
            OR 
            (
                T1.ITEM_ID <> T2.PRODUCT_ID AND T1.CREATED_TIME <> T2.LAST_TIME
                AND NOT EXISTS(SELECT 1
                       FROM TestingTable2 AS T2a
                       INNER JOIN TestingTable1 AS T1a ON T2a.USER_ID = T1a.BUYER_ID
                       AND 
                       (
                           (T1a.ITEM_ID = T2a.PRODUCT_ID AND T1a.CREATED_TIME <> T2a.LAST_TIME)
                           OR (T1a.ITEM_ID <> T2a.PRODUCT_ID AND T1a.CREATED_TIME = T2a.LAST_TIME)
                       )
                       WHERE T1a.BUYER_ID = T1.BUYER_ID
                       AND (T2a.PRODUCT_ID <> T2.PRODUCT_ID OR T2a.LAST_TIME <> T2.LAST_TIME)                       
                      )
            )
        )
    )

TestingTable2つまり、 :に追加の行がある場合

USER_ID | PRODUCT_ID | 前回
--------- + ---------------- + -----------------------
1345653 333333333333 2012-07-09 05:27:18

結果セットは次のようになります。

BUYER_ID | ITEM_ID | CREATED_TIME | USER_ID | PRODUCT_ID | 前回   
----------- + ----------------- + -------------------- ------- + ---------------- + -------------------- + ---- -------------------
1345653 151851771618 2012-07-09 19:57:33 1345653 150851771618 2012-07-09 19:57:33
1345653 110909316904 2012-07-09 21:29:06 1345653 110909316904 2012-07-09 22:29:06
1345653 221065796761 2012-07-09 19:31:48 1345653 221165796761 2012-07-09 12:31:48
1345653 221065796761 2012-07-09 19:31:48 1345653 333333333333 2012-07-09 05:27:18

これはすべて、誤ったPRODUCT_IDまたはLAST_TIMEごとに関連する行が1つしかないことを前提としていることに注意してください。TestingTable2そうしないと、あらゆる種類のクレイジーなデカルト積の一致が得られます!これを回避するには、一方または両方のテーブルの順序を決定して、最初に一致する行を決定する必要があります。

たとえば、シナリオ1と2の両方を満たす次の行を追加して、TestingTable2何が起こるかを確認します。

USER_ID | PRODUCT_ID | 前回
--------- + ---------------- + -----------------------
1345653 110909316904 2012-07-09 19:57:33
于 2012-07-11T08:32:55.093 に答える
0

全体の試みには1つの大きな問題があります。

UserID / BuyerIDはすべての行で同一であるため、クエリはTestingTable1のすべてのをTestingTable2のすべての行と比較します。

最初の2つの比較がうまくいったのは偶然です。
CREATED_TIMEが類似している行が複数ある場合(ITEM_IDが異なっていても)、それらは互いに比較されます。

私がお勧めするのはこれです:各テーブルにを
追加し、それらを接続します。 そうすれば、TestingTable1の各行をTestingTable2の同等の行と比較でき、結果は「デカルト積」になりません。primary keyforeign key

于 2012-07-11T08:35:02.017 に答える