Повторное использование объединенной таблицы в подзапросе - PullRequest
0 голосов
/ 12 июня 2018

Можно ли как-нибудь повторно использовать ссылку на таблицу, к которой мы присоединились в подзапросе?

У меня есть три таблицы:

  • task_categories, информация о категориях задач
  • task_priorities, приоритеты, связанные с категориями задач
  • task_links, URL-ссылки для каждой отдельной задачи.

Пожалуйста, проверьте эту скрипту SQL.

CREATE TABLE task_categories (
    task_category_id int,
    code varchar(255),
    name varchar(255)
);

CREATE TABLE task_priorities (
    priority_id int,
    task_category_id int,
    priority int
);

CREATE TABLE task_links (
    task_links_id int,
    task_category_id int,
    title varchar(255),
    link varchar(255),
    position int
);

Нам нужно объединить все эти таблицы, если нам нужны ссылки с задачами, имеющими высокий приоритет.Примерно так

select * from task_links t_links
inner join task t on t_links.task_id = t.task_id
inner join task_priorities t_priorities on t.task_id = t_priorities.task_id
where t.code in ('TASK_P2', 'TASK_P3') and
t_priorities.priority = (select min(priority) from task_priorities tp 
                         inner join task t on tp.task_id = t.task_id 
                         where t.code in('TASK_P2', 'TASK_P3'))
order by t_links.position;

Есть ли способ оптимизировать этот запрос?Этот запрос присоединился к таблице дважды, я думаю, что должен быть лучший способ написать этот запрос.

1 Ответ

0 голосов
/ 12 июня 2018

Логика для вашего подзапроса неверна.Не выбирается минимальный приоритет для каждой задачи.

Я предполагаю, что вы действительно хотите:

where t.code in ('TASK_P2', 'TASK_P3') and
      tp.priority = (select min(tp2.priority)
                     from task_priorities tp2
                     where tp2.task_id = t.task_id 
                    )

Это не требует гораздо большей оптимизации, чем индекс для task_priorities(task_id, priority).

...