2012-07-08 33 views
1

這是表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 
1015826235  *260003553381*   *2005-05-27 07:09:56* 
1015826235  *260003553382*   *2002-02-02 19:40:39* 
2012926235  *260003553383*   *2002-06-01 06:58:47* 

如果從與BUYER_ID特定USER_ID表1的數據比較後與下面Table2數據比較Table1數據,那麼最後三行缺少表2中的數據。

USER_ID  | PRODUCT_ID | TIMESTAMPS 
------------+------------------+------------- 
1015826235  220003038067  1004841621 
1015826235  300003861266  1005268799 
1015826235  140002997245  1061569397 
1015826235  200002448035  1005542471 

所以我需要Table2- - 加入表1之後,顯示無論是兩個結果像這樣上面的例子中

BUYER_ID |  ITEM_ID  | CREATED_TIME   |  USER_ID  |  PRODUCT_ID  | TIMESTAMPS 
-----------+-------------------+-------------------------+-----------------+----------------------+------------------ 
1015826235  260003553381  2005-05-27 07:09:56  1015826235   NULL    NULL 
1015826235  260003553382  2002-02-02 19:40:39  1015826235   NULL    NULL 
2012926235  260003553383  2002-06-01 06:58:47  2012926235   NULL    NULL 

OR

BUYER_ID |  ITEM_ID  | CREATED_TIME   | PRODUCT_ID | TIMESTAMPS 
-----------+-------------------+-------------------------+----------------+-------------- 
1015826235  260003553381  2005-05-27 07:09:56   NULL    NULL 
1015826235  260003553382  2002-02-02 19:40:39   NULL    NULL 
2012926235  260003553383  2002-06-01 06:58:47   NULL    NULL 

任何建議將讚賞。

回答

2

我相信你以後有什麼是LEFT JOIN操作;

SELECT * 
FROM Table1 
LEFT JOIN Table2 ON Table1.ITEM_ID = TABLE2.PRODUCT_ID AND Table1.BUYER_ID = Table2.USER_ID 
WHERE Table2.PRODUCT_ID IS NULL 

我們現在實際上是說的是「我帶回來從表2中有匹配的產品和用戶ID的所有行,以及所有那些不這樣做(在LEFT JOIN位),然後只顯示我的表2中沒有匹配的東西(IS NULL位)。「

加入整齊這裏解釋:

Jeff Atwood's Visual Guide to SQL Joins

+0

感謝破折號,是的,這工作。我已經在SO上發佈了另外一個問題,其中沒有人回覆。 [http://stackoverflow.com/questions/11386368/sql-query-join-with-table](http://stackoverflow.com/questions/11386368/sql-query-join-with-table)。你可以請看一看嗎?這對我很有幫助。 – ferhan 2012-07-08 22:39:12

1

你只需要使用一個LEFT JOIN,其中將包括從源表中的行,即使沒有匹配的連接表,字段的選擇NULL那會來自它。

SELECT Table1.BUYER_ID 
    , Table1.ITEM_ID 
    , Table1.CREATED_TIME 
    , Table2.USER_ID 
    , Table2.PRODUCT_ID 
    , Table2.TIMESTAMPS 
    FROM Table1 
     LEFT JOIN Table2 ON Table1.BUYER_ID = Table2.USER_ID 

您可以在上面加入

WHERE BUYER_ID NOT IN (SELECT USER_ID FROM Table2) 

或過濾到缺少表2中(讓你的例子)行,取出NOT得到記錄,其中有一場比賽(你的第二個例)。

(您也可以使用WHERE PRODUCT_ID = NULL作爲@dash建議,但並不表示完全一樣的意圖。)

+0

我同意,但出於效率考慮,我寧願避免相關的子查詢。我喜歡NULL檢查比數據操作更多的設置操作,但是:-) – dash 2012-07-08 22:04:38

+0

但是唯一的問題是,對於Table2.USER_ID,我總是得到NULL。 – ferhan 2012-07-08 22:30:36

+0

感謝哈波,是的,像一個魅力工作,但唯一一個問題,我張貼上面。感謝您的解決方案。我已經在SO上發佈了另外一個問題,其中沒有人回覆。 [http://stackoverflow.com/questions/11386368/sql-query-join-with-table](http://stackoverflow.com/questions/11386368/sql-query-join-with-table)。你可以請看一看嗎?這對我很有幫助。 – ferhan 2012-07-08 22:31:39