4
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的输出应该是这样的。JOINTable2

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

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

只是添加myCol1andITEM_ID是同一件事和USER_IDandBUYER_ID是同一件事。

PS-我需要使用上面的查询来与 Table2 进行 JOIN。

4

2 回答 2

3

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

表 2 中未在上表中的所有数据

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

更新:好吧,如果您想以JOIN任何方式使用这两个表,那么您可以使用LEFT JOIN. 请注意,您必须添加WHERE t1.myCol1 IS NULL才能仅从 Table2 中获取不在上表中的所有数据:

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

演示

更新 2: SQL 标准规定TableReference1 JOIN TableReference2 ON ...如下图1所述:

在此处输入图像描述

表引用可以是Table2直接像我上面的查询中的表名,也可以是联接表,或者是仅选择您在列中发布的某些特定列的 SELECT 语句。


1来自SQL 查询的图像,仅适用于凡人

于 2012-07-07T07:24:49.110 回答
1

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

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

于 2012-07-07T06:17:30.553 回答