Дополнительное условие, используемое для фильтрации только по некоторым типам столбцов - PullRequest
0 голосов
/ 06 февраля 2020

Вот мой вариант использования: я хотел бы отфильтровать все записи по одному условию и дополнительно отфильтровать некоторые записи по дополнительному условию.

EDITED

Вот два условия:

  1. все записи должны соответствовать условию created_at > SYSDATE + 30
  2. записей из таблица пользователи , которые имеют (совместно используют) тот же идентификатор, что и в таблице черный список (join on u.id = b.id), где столбец конечная точка равен XYZ, должен иметь столбец delayed_until , который соответствует критерию older than now. Если конечная точка не равна XYZ, применяется только 1-е условие.

Я задал следующий запрос:

SELECT    * users u 
left join blacklist b 
ON        u.id = b.id 
AND       b.delayed_until < SYSDATE 
AND       u.endpoint = 'XYZ' 
WHERE     u.created_at > SYSDATE + 30;

Вот мой схема (упрощенная):

enter image description here

Мой запрос выполняет то, что предполагалось? Можно ли переписать его так, чтобы оно было быстрее? Если да, то как?

1 Ответ

0 голосов
/ 06 февраля 2020

Я думаю, что это то, что вы хотите:

SELECT *
FROM users u JOIN
     blacklist b 
     ON u.id = b.id AND
        (b.delayed_until <= SYSDATE OR
         u.endpoint <> 'XYZ'
        )      
WHERE u.created_at > SYSDATE + 30;

Фильтрация по первой таблице в предложении ON не имеет смысла с LEFT JOIN.

Для этого запрос, вы хотите индексы на users(endpoint, created_at, id) и blacklist(id, delayed_until).

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