使用SQL JOIN比较两个表

时间:2012-07-09 00:07:09

标签: sql join group-by

这是Table1数据。

USER_ID     |    PRODUCT_ID    |   TIMESTAMPS
------------+------------------+-------------
1015826235       220003038067     *1004941621*
1015826235       300003861266      1005268799
1015826235       140002997245      1061569397
1015826235      *210002448035*     1005542471

如果您将Table1数据与以下Table2数据进行比较,那么PRODUCT_ID数据最后一行中的Table1ITEM_ID不匹配在以下Table2数据的最后一行中,TIMESTAMPS数据的第一行中与Table1相同的数据与CREATED_TIME的第一行中的Table2不匹配1}}数据。

BUYER_ID     |    ITEM_ID         |   CREATED_TIME 
-------------+--------------------+------------------------
1015826235       220003038067       *2001-11-03 19:40:21*
1015826235       300003861266        2001-11-08 18:19:59
1015826235       140002997245        2003-08-22 09:23:17
1015826235      *200002448035*       2001-11-11 22:21:11

所以我需要在使用Table2 JOINING Table1之后为上面的例子显示这样的结果 - 以下输出中的任何一个都适合我。

BUYER_ID    |     ITEM_ID       |    CREATED_TIME         |    PRODUCT_ID     |       TIMESTAMPS
------------+-------------------+-------------------------+-------------------+-----------------
1015826235       220003038067       *2001-11-03 19:40:21*      220003038067       *1004941621*
1015826235      *200002448035*       2001-11-11 22:21:11      *210002448035*       1005542471

BUYER_ID   |     ITEM_ID       |    CREATED_TIME         |     USER_ID      |       PRODUCT_ID     |   TIMESTAMPS
-----------+-------------------+-------------------------+------------------+----------------------+------------------
1015826235       220003038067       *2001-11-03 19:40:21*      1015826235           220003038067       *1004941621*
1015826235      *200002448035*       2001-11-11 22:21:11       1015826235          *210002448035*       1005542471

任何帮助将不胜感激。

更新: -

select * from (select * from (select user_id, prod_and_ts.product_id as 
product_id, prod_and_ts.timestamps as timestamps from testingtable2 LATERAL VIEW
explode(purchased_item) exploded_table as prod_and_ts) prod_and_ts LEFT OUTER 
JOIN table2 ON ( prod_and_ts.user_id = table2.buyer_id AND table2.item_id =
prod_and_ts.product_id AND prod_and_ts.timestamps = UNIX_TIMESTAMP
(table2.created_time) ) where table2.buyer_id IS NULL) set_a LEFT OUTER JOIN
table2 ON (set_a.user_id = table2.buyer_id AND  ( set_a.product_id = 
table2.item_id OR set_a.timestamps = UNIX_TIMESTAMP(table2.created_time) ));

2 个答案:

答案 0 :(得分:1)

我相信以下内容应该返回一张表,就像你列出的第二张表一样。

SELECT T2.BUYER_ID, T2.ITEM_ID, '*'+T2.CREATED_TIME+'*' as CREATED_TIME, T1.USER_ID, T1.PRODUCT_ID, '*'+T1.TIMESTAMPS+'*' as TIMESTAMPS
FROM Table1 T1
    INNER JOIN Table2 T2 ON T1.USER_ID = T2.BUYER_ID
    AND T1.PRODUCT_ID = T2.ITEM_ID
    AND T1.TIMESTAMPS <> T2.CREATED_TIME
UNION
SELECT T2.BUYER_ID, '*'+T2.ITEM_ID+'*' as ITEM_ID, T2.CREATED_TIME, T1.USER_ID, '*'+T1.PRODUCT_ID+'*' as PRODUCT_ID, T1.TIMESTAMPS
FROM Table1 T1
    INNER JOIN Table2 T2 ON T1.USER_ID = T2.BUYER_ID
    AND T1.TIMESTAMPS = T2.CREATED_TIME
    AND T1.PRODUCT_ID <> T2.ITEM_ID

第一个语句获取BUYER_ID和USER_ID匹配的所有行,PRODUCT_ID和ITEM_ID匹配,但TIMESTAMPS和CREATED_TIME不匹配。

第二个获取BUYER_ID和USER_ID匹配的所有行,TIMESTAMPS和CREATED_TIME匹配,但PRODUCT_ID和ITEM_ID不匹配。

如果有人不止一次购买同一种产品,或者有人在同一时间购买了2种不同的产品,那么这当然会很麻烦。

答案 1 :(得分:0)

在我看来,您希望LE_ JOIN加入USER_ID = BUYER_ID,PRODUCT_ID = ITEM_ID,TIME1 = TIME2上的两个表。

有些行将匹配所有三个字段,并在所有三列中生成非空值。你想要的其他人 报告。

然后,您希望以相反的顺序对表运行相同的查询。

因此,您将在第一个表中包含所有不匹配的行,并在第二个表中包含不匹配的行。

SELECT * from table1 LEFT JOIN table2 ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2)
       WHERE buyer_id IS NULL
UNION
select * from table1 RIGHT JOIN table2 ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2)
       WHERE product_id IS NULL;

我认为没有办法调和两者;一般来说,你甚至不确定拥有相同的数字 两个查询中的行数。也许你可以在两个不匹配的集合之间运行第二个查询,注意到 共享userid和productid的行,或userid和timestamp。但你也应该跟踪共享的线路吗?

例如,获取非匹配集1并尝试根据产品ID或时间戳将其与table2匹配(两者都不能 匹配,或第一个JOIN匹配,且buyer_id不会为NULL)

 SELECT * FROM
     ( SELECT table1.user_id, table1.product_id, table1.ts1 FROM table1 LEFT JOIN table2 
          ON ( user_id = buyer_id AND item_id = product_id AND ts1 = ts2) WHERE buyer_id IS NULL ) AS set_a
     LEFT JOIN table2
     ON ( set_a.user_id = table2.buyer_id AND 
        ( set_a.product_id = table2.item_id OR set_a.ts1 = table2.ts2 ));

对table1反向运行将以另一种方式获取部分匹配。

如果行的数量始终相同并且与userid匹配,则上面的查询将给出预期结果。除了我在我的例子中定义ts1和ts2作为两个时间戳;时间戳和日期/时间之间的所有比较都需要适当的转换功能,例如

  ts1 = ts2

可能会成为

  DATETIME(ts1) = ts2

  ts1 = UNIX_TIMESTAMP(ts2)

等,取决于ts1和ts2以及平台的实际定义(例如,MySQL vs SQL Server vs PostgreSQL ...)。