我的用例是检索客户的发票和每张发票的格式代码,这些代码是通过加入到customer_list
表中的加入找到的,该表加入到通用代码表以计算格式代码。如何优化嵌套选择?
我的查询的简化版本如下,它工作正常,但子查询将返回大约5k行,我不知道如何优化,以便子查询不包含尽可能多的行。
select i.invoice_number,
f.format_code
from invoices i
left join (
select gc.code_1 as format_code,
ls.account
from gen_codes gc,
customer_list ls
where gc.code_name = 'invoice-format'
and gc.code_1 <> ''
and ls.list_type = gc.code_value
) f on account = i.account
or account = i.billing_account
where i.account = :accountNumber
注意:并非所有的发票有一个格式代码,这是很好的,为什么我执行左连接。
UPDATE:不使用内部的选择将是以下形式的类似查询:
select i.invoice_number,
f.code_1 as format_code
from invoices i
left join customer_list ls on
(account = i.account or account = i.billing_account) and ls.list_type in (
select code_value
from gen_codes
where code_name = 'invoice-format'
and code_1 <> ''
)
left join gen_codes f on code_value = ls.list_type
and code_name = 'invoice-format'
and code_1 <> ''
我有一种感觉,这后一种版本可能是因为有在gen_codes
只有二十几记录更有效与匹配的查询,而customer_list
包含约50万记录与〜5K匹配的第一个版本。
为了帮助我更好地理解内部选择语句,SQL引擎如何解释这一点?他们是否在外部选择语句之前执行内部选择?如果是这样的话,这个结果会在选择的其余部分被重用,所以它只会被执行一次? –