2012-07-09 122 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