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

: すべての請求書にフォーマット コードがあるわけではありません。

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 <> ''

この後者のバージョンは、最初のバージョンに一致する〜5kのレコードが含まれgen_codesているのに対し、一致したクエリには2ダースのレコードしかないため、より効率的であると感じています。customer_list

4

1 に答える 1

0

私なら次のように書きます。

アカウントまたは請求先アカウントに対応するすべての請求書を取得し (JOIN および ON 句を使用)、一致したアカウントの list_types に関連付けられた gen_codes のみを取得します (LEFT JOIN を使用)。空の。

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 に答える