Как лучше оптимизировать SQL-запросы? - PullRequest
0 голосов
/ 08 октября 2018

Я написал запрос, но боюсь, что он может быть неоптимизирован, и у меня возникнет проблема.

Задание: Найти пользователей, у которых нет долгов, и их последний платеж был старше 2года.Ненужные пользователи, у которых не было заказов

У нас есть две таблицы:

User tbl (Id (int), LastName (string))
Order tbl (Id (int), UserId (int), IsPaid (bool), DatePaid (Date, not null))

Я написал запрос на Sql, но боюсь, что я не в состоянии20 тыс. Пользователей и много заказов

Я нашел всех, у кого нет долгов, и последний платеж за двухлетний период.Теперь я хочу удалить их из общего списка, и поэтому пользователи, которые нуждаются во мне, остаются.
Кажется, это плохая идея

SELECT u."Id"
FROM "User" AS u
LEFT JOIN
   (SELECT *
    FROM "Order"
    WHERE "UserId" IN
       (SELECT "Id"
        FROM "User"
        WHERE "Id" NOT IN
           (SELECT DISTINCT "UserId"
            FROM "Order"
            WHERE "IsPaid" IS FALSE )
       )
    AND "DatePaid" > '2016-10-10'
   ) AS p
   ON p."UserId" = u."Id";

1 Ответ

0 голосов
/ 08 октября 2018

Я думаю, вы просто хотите что-то вроде этого:

select o.userid
from orders o
group by o.userid
having sum(case when o.isPaid then 1 else 0 end) = count(*) and -- all are paid
       max(o.paymentdate) < current_date - interval '2 year';

Обратите внимание, что функции даты общеизвестны для конкретной базы данных.Выше используется стандартный синтаксис ANSI / ISO.

Если вы хотите получить полную информацию о пользователях, вы можете использовать другую структуру:

select u.*
from users u
where not exists (select 1
                  from orders o
                  where o.userid = u.id and not u.ispaid
                 ) and
      not exists (select 1
                  from orders o
                  where o.userid = u.id and
                        u.paymentdate > current_date - interval '2 year'
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...