0

我的用例是检索客户的发票和每张发票的格式代码,该代码是通过连接到一个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 匹配。

4

1 回答 1

0

我会这样写:

获取与帐户或计费帐户相对应的所有发票(使用 JOIN 和 ON 子句),并仅获取与匹配帐户的 list_types 相关联的那些 gen_codes(使用 LEFT JOIN),其 code_name 为 'invoice-format' 而 gc.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 记录。

于 2012-09-17T11:12:07.637 回答