如何在子查询中使用外部查询中的列从另一个表中获取结果?

Posted

技术标签:

【中文标题】如何在子查询中使用外部查询中的列从另一个表中获取结果?【英文标题】:how to use columns from outer query in subquery to get result from another table? 【发布时间】:2018-01-22 11:34:52 【问题描述】:

我正在尝试使用表中的子查询针对 hive 中另一个表的每一行来获取聚合结果。我知道 hive 不支持 SELECT 子句中的子查询,所以我试图在 FROM 子句中使用子查询,但似乎 hive 也不支持相关子查询。

这是示例:表 A 包含具有日期列(d1 和 d2)和货币列以及其他列的帐户交易数据,我想要做的是获取表 B 中的汇率值的总和(其中每个帐户的日期 d1 和 d2 之间包含一年中每一天的货币汇率。我正在尝试这样的事情:

SELECT 
    account_no, currn, balance, 
    trans_date as d2, last_trans_date as d1, exchng_rt 
FROM 
    acc AS A, 
    (SELECT sum(rate) exchng_rt 
     FROM currency 
     WHERE curr_type = A.currn 
       AND banking_date BETWEEN A.d1 AND A.d2) AS B

这里是示例,表 A 的帐户交易和日期如下:

account    balance    trans_date    last_trans_date    currency
abc        100        20-12-2016    20-11-2016          USD
abc        200        25-12-2016    20-12-2016          USD
def        500        15-11-2015    10-11-2015          AUD
def        600        20-11-2015    15-11-2015          AUD

表 B 是这样的:

curr_type     rate    banking_date
USD           50.9    01-01-2016
USD           50.2    02-01-2016
USD           50.5    03-01-2016
AUD           50.9    01-01-2016
AUD           50.2    02-01-2016
AUD           50.5    03-01-2016  and so on...

所以表格包含每种货币的每日汇率

【问题讨论】:

编辑您的问题并提供示例数据和所需结果。 【参考方案1】:

我认为你可以使用JOINGROUP BY 做你想做的事:

SELECT a.account_no, a.currn, a.balance, a.trans_date as d2, a.last_trans_date as d1,
       SUM(rate) as exchng_rt 
FROM acc a LEFT JOIN
     currency c
     ON c.curr_type = a.currn and banking_date between A.d1 and A.d2
GROUP BY a.account_no, a.currn, a.balance, a.trans_date, a.last_trans_date;

【讨论】:

不能真正使用 group by,因为该表包含每个帐号的多个条目。我想分别获取每个交易条目或行的汇率 @Atif 。 . .有多个 group by 键,所以这应该不是问题。如果您有主键,请将其也放入group by【参考方案2】:

您应该在连接两个表后指定过滤器,如下所示:

选择 A.account_no,
        A.currn,
        平衡,
        A.trans_date 为 d2,
        A.last_trans_date 为 d1,
        B.exchng_rt
FROM acc as A
JOIN (SELECT sum(rate) as exchng_rt,
         curr_type,
         银行日期
    FROM 货币组 by curr_type,
         银行日期)作为B
ON A.currn = curr_type
WHERE B.banking_date 在 A.d1 和 A.d2 之间

【讨论】:

该组不会给出所需的结果,因为货币表每天都有记录,我想获得指定时期之间的汇率 banking_date 不等于一天吗?子查询按银行日期分组,外部查询按同一字段过滤。我在这里错过了什么?

以上是关于如何在子查询中使用外部查询中的列从另一个表中获取结果?的主要内容,如果未能解决你的问题,请参考以下文章

用单个列从另一个表更新一个表中的多个列?

如何在子查询中使用主查询中的列?

SQL Server - 在子查询中使用主查询中的列

如何获取输入文件名作为 AWS Athena 外部表中的列

查询从 3 个表中获取数据,主表和总和列从彼此 2 个表中获取

使用其他表的列从表中删除