这个问题在这里已经有了答案:




8年前关闭。






如果这是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

我需要在 TestingTable2TestingTable1 上比较 BUYER_IDUSER_ID 。我需要看看,如果 BUYER_IDUSER_ID 匹配,那么我需要将 ITEM_IDPRODUCT_IDCREATED_TIMELAST_TIME 进行比较,如果在与其中一个或两个中的 TestingTable2 比较后 TestingTable1 不匹配,那么我需要显示结果。

所以如果你看上面的例子 - 我基本上有三个场景
  • 首先-在 TestingTable1 中,在第一行中 ITEM_IDPRODUCT_ID 第一行中的 TestingTable2 不匹配,但 CREATED_TIME
  • 两个表中第一行的 LAST_TIME 匹配
  • 其次-在 TestingTable1 中,在第二行 CREATED_TIMELAST_TIME 的第二行中的 TestingTable2 不匹配,但 ITEM_ID 与两个表中第二行的 PRODUCT_ID 匹配
  • 第三 - 在 TestingTable1 中,在第三行 ITEM_IDPRODUCT_ID 不匹配,而且 CREATED_TIMELAST_TIME 不匹配,因此在第三行中,它们与 TestingTable1 第三行不匹配。

  • 所以这是我在比较 TestingTable2TestingTable1 时需要涵盖的三种情况。而TestingTable1是MAIN表,总是需要通过它进行比较,所以TestingTable1中的数据总是准确的。

    因此,考虑到上面的示例,如果不匹配其中一个或两个,我需要显示这样的结果-TestingTable1 数据然后在相同的 TestingTable2 数据旁边,以便我可以看到与 TestingTable1 相比,TestingTable2 中有什么值
    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
    

    所以我写了一个查询,我认为它会涵盖我所有的三个场景,但只有它涵盖 First Two 而不是 Third One 。我很困惑我们是否可以实现这第三种情况?
    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
    

    任何建议将不胜感激。

    更新:-

    只是快速更新我最初想做的事情。因为我知道我的第三种情况很少有问题。

    首先,在 TestingTable1 中,我正在按 BUYER_IDCREATED_TIME 对表进行排序(ORDER BY),并且与 TestingTable2 相同我正在使用 USER_IDLAST_TIME 进行排序,并且我正在通过确保数据在给定日期属于 BUYER_IDUSER_ID 来进行比较。

    最佳答案

    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 Fiddle

    关于sql - 连接两个表并从它们中获取输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11428269/

    10-12 05:11