我的用例是检索客户的发票和每张发票的格式代码,这些发票是由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
包含〜五十万条记录,第一个匹配约为5k版本
答案 0 :(得分:0)
我会写如下:
获取与帐户或结算帐户相对应的所有发票(使用JOIN和ON子句),并仅获取与code_name为“invoice-format”和gc匹配的帐户list_types相关联的gen_codes(使用LEFT JOIN)。 code_1不为空。
SELECT
i.invoice_number,
gc.code_1 as format_code
FROM
invoices i
JOIN customer_list ls
ON
(i.billing_account = ls.account OR i.account = ls.account) AND
i.account = :accountNumber
LEFT JOIN gen_codes gc
ON
ls.list_type = gc.code_value AND
gc.code_name = 'invoice-format' AND
gc.code_1 != ''
与您问题中的子查询相比,这将修剪与预先输入的accountNumber不匹配的customer_list记录。