2012-07-09 131 views
2

这是Table1数据。使用SQL JOIN比较两个表格

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

如果比较Table1数据与下面Table2数据,然后在Table1数据的最后一行PRODUCT_ID没有与ITEM_ID最后一行在下面Table2数据匹配,也同样有TIMESTAMPS在第一行Table1的数据与CREATED_TIME的数据不匹配,第一行的数据为Table2

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表1后为我好,显示这样的结果对于上面的例子。

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 

OR

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))); 
+0

你不是已经问过这个问题了吗? [SQL查询JOIN与表](http://stackoverflow.com/questions/11386368/sql-query-join-with-table) – 2012-07-09 00:11:55

+0

我问它,但在我发布Table1作为一个单独的SQL查询,但在这里我有通过将Table1和Table2分开以使人们不会感到困惑,简化了它。 – ferhan 2012-07-09 00:13:57

+0

然后,我会删除您之前的问题,否则您将会以完全相同的方式关闭此问题。 – 2012-07-09 00:15:19

回答

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比赛,但时间戳和CREATED_TIME不匹配的所有行。

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

如果有人购买同一产品的次数超过一次,或者某人在同一时间购买了两种不同的产品,这当然会很麻烦。

+0

感谢Tee的评论,在我的情况下,无法使用LEFT或RIGHT加入?因为我与Hive一起工作,它支持sql语法,但目前Hive不支持INNER JOIN,因此我无法使用上述查询。但是我可以使用INNER JOIN以外的任何其他连接。 – ferhan 2012-07-09 06:35:04

0

在我看来,要LEFT 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的行,或用户标识和时间戳记 。但是你也应该跟踪共享两条线吗?

例如,拿不匹配的组1,并尝试基于产品ID或时间戳和表2来配合它(既不能 匹配,或先加入会匹配,并且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的实际定义。 ..)。

+0

感谢Iserni的评论。我不确定我明白你刚才所说的话。你给我的例子将为我提供我正在寻找的实际输出?以及我应该从您的评论中使用哪个查询来获取我的实际输出。我很困惑。 – ferhan 2012-07-09 01:11:25

+0

我试过你的上面的查询,但它没有给我期待的输出。 :( – ferhan 2012-07-09 03:31:21

+0

第二个查询应该除了你需要调整时间戳比较(取决于日期和时间在你的平台上的工作方式:它是MySQL,SQL Server还是其他的?) – LSerni 2012-07-09 05:58:22