加入两个类似的表

时间:2012-07-08 21:51:31

标签: sql join group-by

这是Table1数据。

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*

如果您将Table1数据与下面的Table2数据进行比较,那么在从具有BUYER_ID的特定USER_ID的Table1数据进行比较后,Table2数据中缺少最后三行。

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

所以我需要在使用Table2 JOINING Table1后显示上述示例中的两个结果中的任何一个 -

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

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 个答案:

答案 0 :(得分: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位)带回来。然后只显示那些不符合要求的内容t表2中有匹配(IS NULL位)。“

联接在这里整齐地解释:

Jeff Atwood's Visual Guide to SQL Joins

答案 1 :(得分: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

您可以通过添加

将上述内容过滤到Table2中缺少的行(以获取示例)
 WHERE BUYER_ID NOT IN (SELECT USER_ID FROM Table2)

或者,移除NOT以获取匹配的记录(第二个示例)。

(您也可以使用WHERE PRODUCT_ID = NULL作为@dash建议,但它没有表达完全相同的意图。)