【问题标题】:join two query using SQL使用 SQL 连接两个查询
【发布时间】:2012-07-07 05:41:55
【问题描述】:
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,所以在我上面写的查询和Table2数据之间的JOIN之后的输出应该是这样的。

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

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

只是添加myCol1ITEM_ID是同一个东西,USER_IDBUYER_ID是同一个东西。

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

【问题讨论】:

    标签: sql join nosql


    【解决方案1】:

    正如@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
       
    

    DEMO

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

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


    1 图片来自SQL Queries for Mere Mortals

    【讨论】:

    • 感谢您的评论,但我不只是需要ITEM_ID,我需要这样的数据,最后一行完整*1015826235* *260003553381* *2002-01-30 23:12:18*
    • @rjchar, SELECT * 将为您提供完整的行,例如第二个表中的BUYER_ID, ITEM_ID, CREATED_TIME。这不是你需要的吗?
    • 其实我明白你的意思,但我的问题是我需要使用我上面写的查询来加入Table2,我不能像这样简单地这样做,因为我写的查询我需要以某种方式使用它。所以这就是我问我是否可以使用我的查询加入 Table2 的原因。
    • 感谢 Mahmoud 费了这么大的力气来解释我,因为我是这些东西的新手,但是我从查询中获得的数据实际上并不是一个表格,我从那个查询中获得的数据仅,这意味着在您的示例中,AboveTable 是我从该查询中获得的数据。所以我需要以某种方式使用该查询来加入 table2。所以如果我在下面这样做,那会很好吗?
    • SELECT * from (SELECT test2.user_id,myTable1.myCol1 FROM testingtable2 test2 LATERAL VIEW explode(test2.purchased_item.product_id) myTable1 AS myCol1) myTable1 LEFT OUTER JOIN Table2 ON (Table2.item_id = myTable1.myCol1) where myTable1.myCol1 IS NULL ;
    【解决方案2】:

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

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

    【讨论】:

    • 您能否根据我的 sql 示例向我展示示例基础。那我就能明白更多了。但是我这里没有办法使用 JOIN 吗?
    • 我正在使用 NOSQL 环境。所以这就是我问我们是否可以使用 JOIN 来执行此操作的原因,因为 JOIN 语法将在 NOSQL 环境中工作,因为我目前正在使用 Hive
    • 这肯定与提及有关,尤其是因为您的标签显示 SQL :)
    • 是的,看来我们也可以在 Hive 中使用 sql 语法。所以这就是我问这个的原因如果我们可以使用JOIN以某种方式做到这一点?我也可以在 Hive 中尝试该 sql 语法,看看它是否有效..
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    相关资源
    最近更新 更多