Как упростить этот запрос для БД Oracle? - PullRequest
0 голосов
/ 01 ноября 2018
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, но включает только записи OrderA, если один и тот же пользователь разместил OrderB в том же месяце.

Для этого примера данных запрос должен дать 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

есть предложения? Я чувствую, что есть лучший способ реализовать этот запрос.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018
SELECT userId, SUM (a.amount) 
FROM (
            SELECT 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 a.userId, a.amount
    )
GROUP BY userId;

может быть быстрее с той же логикой без отличных.

0 голосов
/ 01 ноября 2018

Делает ли это то, что вы хотите?

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...