在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值
Posted
技术标签:
【中文标题】在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值【英文标题】:Using two aggregate values from a SELECT subquery in a single outer SELECT query 【发布时间】:2021-02-01 07:26:54 【问题描述】:对于相关的表和列(比以下更多),我有一个customer
表,其中包含cust_id
和state
列和一个account
表,其中包含account_id
、cust_id
和avail_balance
列。
示例customer
表:
| cust_id | state |
|--------:|-------|
| 1 | MA |
| 2 | MA |
| 3 | MA |
| 4 | MA |
| 5 | NH |
| 6 | MA |
| 7 | MA |
| 8 | NH |
| 9 | MA |
| 10 | NH |
| 11 | MA |
| 12 | NH |
| 13 | MA |
示例account
表:
| account_id | cust_id | avail_balance |
|-----------:|--------:|--------------:|
| 1 | 1 | 1057.75 |
| 2 | 1 | 500 |
| 3 | 1 | 3000 |
| 4 | 2 | 2258.02 |
| 5 | 2 | 200 |
| 7 | 3 | 1057.75 |
| 8 | 3 | 2212.5 |
| 10 | 4 | 534.12 |
| 11 | 4 | 767.77 |
| 12 | 4 | 5487.09 |
| 13 | 5 | 2237.97 |
| 14 | 6 | 122.37 |
| 15 | 6 | 10000 |
| 17 | 7 | 5000 |
| 18 | 8 | 3487.19 |
| 19 | 8 | 387.99 |
| 21 | 9 | 125.67 |
| 22 | 9 | 9345.55 |
| 23 | 9 | 1500 |
| 24 | 10 | 23575.12 |
| 25 | 10 | 0 |
| 27 | 11 | 9345.55 |
| 28 | 12 | 38552.05 |
| 29 | 13 | 50000 |
这是我希望优化的查询示例。
SELECT account.cust_id
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND customer.state = 'MA'
AND customer.cust_id >
(SELECT MAX(customer.cust_id) AS max_nh_cust_id
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND state = 'NH')
AND account.avail_balance >
(SELECT MAX(avail_balance) AS max_nh_avail_balance
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND state = 'NH');
上述示例数据的预期结果(如果数据不同,可能不仅仅是 1 个结果):
| cust_id |
|--------:|
| 13 |
上面的问题是代码冗余以及我们如何使用两个子查询多次遍历account
表。我希望可以使用一个子查询从account
表中获取最大值cust_id
和avail_balance
,并在外部查询中使用这两个标量。例如,查询的形状可能如下所示:
SELECT account.cust_id
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND (customer.cust_id > max_nh_cust_id AND account.avail_balance) > max_nh_avail_balance) IN
(SELECT MAX(customer.cust_id) AS max_nh_cust_id, MAX(avail_balance) AS max_nh_avail_balance
FROM account, customer
WHERE
account.cust_id = customer.cust_id
AND state = 'NH');
显然,上述方法不起作用。实现上述代码冗余较少且仅在一个查询中(可能包含子查询)的最有效方法是什么?
【问题讨论】:
请以表格文本形式提供示例数据和所需结果。目前还不清楚您要在这里做什么。 @GMB 我添加了样本数据和样本结果 @RickJames 会的。谢谢你的建议! 【参考方案1】:您可以将 2 个子查询合并为 1 个:
SELECT MAX(c.cust_id) AS max_nh_cust_id,
MAX(a.avail_balance) AS max_nh_avail_balance
FROM account a INNER JOIN customer c
ON a.cust_id = c.cust_id
WHERE c.state = 'NH'
并像这样加入它:
SELECT a.cust_id
FROM account a
INNER JOIN customer c ON a.cust_id = c.cust_id
INNER JOIN (
SELECT MAX(c.cust_id) AS max_nh_cust_id,
MAX(a.avail_balance) AS max_nh_avail_balance
FROM account a INNER JOIN customer c
ON a.cust_id = c.cust_id
WHERE c.state = 'NH'
) t ON c.cust_id > t.max_nh_cust_id AND a.avail_balance > t.max_nh_avail_balance
WHERE c.state = 'MA'
请参阅demo。 结果:
> | cust_id |
> | ------: |
> | 13 |
【讨论】:
嗨!我对我的问题进行了轻微调整,还询问了有关将连接列与聚合函数值一起使用的问题。如果您可以附加您对此添加的答案,我将不胜感激! 这是一个新要求,应该是一个新问题。 我明白了。会的!以上是关于在单个外部 SELECT 查询中使用来自 SELECT 子查询的两个聚合值的主要内容,如果未能解决你的问题,请参考以下文章