此查询的RIGHT JOIN
会在TABLE ACCESS FULL
上生成lims.operator
。常规联接可以快速运行,但当然,样本“WHERE authorised_by IS NULL
”不会显示。
在这种情况下,RIGHT JOIN
是否有更有效的替代方案?
SELECT full_name
FROM (SELECT operator_id AS authorised_by, full_name
FROM lims.operator)
RIGHT JOIN (SELECT sample_id, authorised_by
FROM lims.sample
WHERE sample_template_id = 200)
USING (authorised_by)
注意:显示的所有列(full_name除外)都是索引的,并且是某个表的主键。
答案 0 :(得分:2)
由于您正在进行外连接,因此实际上更有效的是执行全表扫描而不是使用索引。
如果您确信应该使用索引,请使用提示强制它:
SELECT / * + INDEX(lims.operator operator_index_name)* / ...
然后看看会发生什么......
答案 1 :(得分:1)
无需嵌套查询。试试这个:
select s.full_name
from lims.operator o, lims.sample s
where o.operator_id = s.authorised_by(+)
and s.sample_template_id = 200
答案 2 :(得分:1)
我一段时间没有为oracle编写sql,但我会写这样的查询:
SELECT lims.operator.full_name
FROM lims.operator
RIGHT JOIN lims.sample
on lims.operator.operator_id = lims.sample.authorized_by
and sample_template_id = 200
这仍然表现不好吗?