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*

如果您将 Table1数据与以下Table2数据进行比较,则在将特定 USER_ID 与 BUYER_ID 的 Table1 数据进行比较后,Table2 数据中的最后三行将丢失。

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

因此,在将 Table1 与 Table2 连接之后,我需要在上面的示例中显示两个结果中的任何一个 -

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

任何建议将不胜感激。

4

2 回答 2

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 的所有行以及所有不匹配的行(左连接位)带回给我。然后只显示那些没有匹配的东西匹配表 2(IS NULL 位)。”

联接在这里得到了巧妙的解释:

Jeff Atwood 的 SQL 连接可视化指南

于 2012-07-08T21:55:48.010 回答
1

您只需要使用 a 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 建议的,但它表达的意图并不完全相同。)

于 2012-07-08T21:57:59.120 回答