如何优化嵌套选择?

时间:2012-09-17 10:47:10

标签: sql openedge

我的用例是检索客户的发票和每张发票的格式代码,这些发票是由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版本

1 个答案:

答案 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记录。