我们有什么方法可以重用我们在子查询中加入的表的引用?
我有三张桌子:
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;
有没有办法优化此查询?这个查询已连接两次表,我认为应该有更好的方法来编写这个查询。
答案 0 :(得分:0)
子查询的逻辑不正确。它没有为每项任务选择最低优先级。
我猜你真的想要:
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)
上的索引更多的优化。