使用SQL连接两个查询

时间:2012-07-07 05:41:56

标签: sql join nosql

SELECT test2.user_id,myTable1.myCol1 FROM testingtable2 test2 LATERAL VIEW 
explode(test2.purchased_item.product_id) myTable1 AS myCol1;

我使用上述查询获得以下输出结果。

  USER_ID    |     myCol1  
-------------+---------------
1015826235      220003038067

1015826235      300003861266

1015826235      140002997245

1015826235      200002448035

如果您将查询的上述输出与以下Table2数据进行比较,则上述查询输出中缺少Table2数据的最后一行。

这是第二个Table2。

 BUYER_ID    |       ITEM_ID      |        CREATED_TIME
-------------+--------------------+--------------------------
1015826235        220003038067          2012-06-21 07:57:39 

1015826235        300003861266          2012-06-21 21:11:12 

1015826235        140002997245          2012-06-14 20:10:16 

1015826235        200002448035          2012-06-08 22:02:17 

*1015826235*     *260003553381*        *2002-01-30 23:12:18*

我需要基本上使用JOIN打印最后一行,所以在我上面写的查询和JOIN数据之间的Table2之后输出应该是这样的。

*1015826235*     *260003553381*         *2002-01-30 23:12:18*

所以我需要在我写的上述查询和JOIN数据之间执行Table2,并获取上述查询数据输出中不存在的所有数据。有什么建议吗?

只是添加myCol1ITEM_ID是一回事,USER_IDBUYER_ID是相同的。

P.S-我需要使用我的上述查询与Table2进行JOIN。

2 个答案:

答案 0 :(得分:3)

正如@ latr0dectus指出的那样,您正在寻找EXCEPT。在您的示例中,您可以使用NOT IN来实现此目的。以下查询将为您提供:

  

Table2中不在上表中的所有数据

SELECT *
FROM Table2
WHERE ITEM_ID NOT IN
(
    SELECT ITEM_ID
    FROM AboveTable
)

更新:好吧,如果您想以任意方式JOIN这两个表,那么您可以使用LEFT JOIN执行此操作。请注意,您必须添加WHERE t1.myCol1 IS NULL才能获得表2中不在上表中的所有数据:

SELECT * 
FROM Table2 t2
LEFT JOIN AboveTable t1 ON t2.ITEM_ID = t1.myCol1
WHERE t1.myCol1 IS NULL

DEMO

Update2: SQL标准指定TableReference1 JOIN TableReference2 ON ...,如下图 1 所述:

enter image description here

表引用可以是像Table2这样的表名,就像我上面的查询一样,或者是一个连接表,或者是一个SELECT语句,它只选择你在列中发布的一些特定列。


1 图像来自SQL Queries for Mere Mortals

答案 1 :(得分:1)

如果您使用的是SQL Server,则可以使用EXCEPT。如果是Oracle,您可以使用MINUS。它基本上会返回查询1和查询2之间的不同。

在您的情况下,执行第二个查询,然后是EXCEPT,然后是第一个查询。