我的用例是检索客户的发票和每张发票的格式代码,该代码是通过连接到一个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
注意:并非所有发票都有格式代码,这很好,也是我执行左连接的原因。
更新:不使用内部选择的类似查询将具有以下形式:
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 匹配。