sql - 如何简化 Oracle DB 的查询?
问题描述
OrderA
-------
userId
orderDate
amount
OrderB
------
userId
orderDate
sample data:
OrderA
1 01/01/2018 100
1 02/01/2018 101
1 03/01/2018 102
OrderB
1 01/01/2018
1 01/10/2018
1 03/01/2018
我有两个订单表,OrderA 和 OrderB。我想编写一个查询,对 OrderA 订单的用户订单金额求和,但如果同一用户在同一个月放置 OrderB,则仅包括 OrderA 条目。
对于此示例数据,查询应给出202
.
此查询有效,但distinct
速度很慢。
SELECT userId, SUM (a.amount)
FROM (
SELECT DISTINCT a.userId,
a.amount
FROM OrderA a
INNER JOIN OrderB b
ON EXTRACT(month from a.orderDate) = EXTRACT(month from b.orderDate) AND
EXTRACT(year from a.orderDate) = EXTRACT(year from b.orderDate) AND
a.userId = b.userId
)
GROUP BY userId
此查询不起作用,它给出301
SELECT userId, SUM (a.amount)
FROM OrderA a
INNER JOIN OrderB b
ON EXTRACT(month from a.orderDate) = EXTRACT(month from b.orderDate) AND
EXTRACT(year from a.orderDate) = EXTRACT(year from b.orderDate) AND
a.userId = b.userId
GROUP BY userId
有什么建议么?我觉得有更好的方法来实现这个查询。
解决方案
这是做你想做的吗?
SELECT a.userId, SUM(a.amount)
FROM OrderA a
WHERE EXISTS (SELECT 1
FROM OrderB b
WHERE TO_CHAR(a.orderDate, 'YYYY-MM') = TO_CHAR(b.orderDate, 'YYYY-MM') AND
a.userId = b.userId
)
GROUP BY a.userId;
出于性能考虑,您需要在OrderB(userId, orderDate)
.
推荐阅读
- node.js - 我不断收到以下错误消息 -TypeError:Todo.createDocument 不是函数
- angular - Angular Electron 应用的单例 redux 商店
- python - Scrapy splash - 循环将所有值仅保存到一项
- c# - 如何在代码隐藏中将 StreamSource 分配给 BitmapImage?
- javascript - 如何在 React Bootstrap 上获取输入表单的值?
- python - 如何修复接收未注册任务错误 - Celery
- ruby-on-rails - Bundler 使用了错误的 Ruby 版本
- javascript - 从表单提交的单选按钮获取 HTML5 自定义数据-* 属性
- c++ - 标记为连接组件的列表表示
- c - 如何避免c中的缓冲区溢出