0

複数のテーブル(名前がわずかに異なる)があり、列名が同じで、他のいくつかの一意のテーブルに結合しています。次に、Caseを使用してこれらのテーブルからデータを選択し、null値を省略します。

CASE WHEN x IS NULL THEN y ELSE xなど。

ただし、含める必要のあるケース関数の数が多いため、クエリが遅くなるのではないかと心配しています。フォームに変更があるたびに、このフォームテーブルの新しいコピーが作成されます。履歴レポートでは、各コピーをクエリして、列の「グループ」ごとに関連データを1つの列に取得する必要があります。また、すべてのテーブルの名前(およびID)を格納するテーブルがあり、ワイルドカードを使用してこのテーブルをクエリし、すべての履歴テーブルを自動的にクエリできるかどうか疑問に思っていました。すべての列ヘッダーが同じであるため、次のようなサブクエリを使用したいと考えていました。

SELECT x, y, x FROM (
    SELECT form_name FROM table_of_table_names
        WHERE form_name LIKE '%mytypeofform%'

そして、通常どおりこのデータを結合できますが、明らかに上記は機能しません。これにより、変更が発生するたびにクエリを編集する必要がなくなります。私が達成しようとしていることは、完全な外部結合と複数のケース関数よりも速くない可能性がありますが、ケース関数を追加するたびに、レポートの実行速度が大幅に低下するように見えます。動的SQLを使用する必要があると通知されましたが、これに関する経験はほとんどありません。ありがとう!

追加情報:

SELECT DISTINCT 

FLODS_CASE_ENQUIRY_F00.CASE_ENQUIRY_ID AS 'Case ID', FLODS_CLASSIFICATION_D00.TYPE AS 'Type', 
CASE WHEN FLODS_101000385_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL THEN (CASE WHEN FLODS_101000386_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000488_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000489_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000508_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000509_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000511_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000512_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN 'No Payment Status' ELSE FLODS_101000512_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000511_SPECIAL_UP_C00.PAYMENTSTATUS END) 
                      ELSE FLODS_101000509_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000508_SPECIAL_UP_C00.PAYMENTSTATUS END) 
                      ELSE FLODS_101000489_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000488_SPECIAL_UP_C00.PAYMENTSTATUS END) 
                      ELSE FLODS_101000386_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000385_SPECIAL_UP_C00.PAYMENTSTATUS END AS 'Payment Status', 
<more columns inc. a couple more columns using similar case functions> 

FROM   FLODS_101000489_SPECIAL_UP_C00 FULL OUTER JOIN
                      FLODS_101000488_SPECIAL_UP_C00 FULL OUTER JOIN
                      FLODS_101000509_SPECIAL_UP_C00 FULL OUTER JOIN
                      FLODS_101000511_SPECIAL_UP_C00 full outer JOIN
                      FLODS_CASE_ENQUIRY_F00 ON FLODS_101000511_SPECIAL_UP_C00.CASE_ENQUIRY_ID = FLODS_CASE_ENQUIRY_F00.CASE_ENQUIRY_ID full outer JOIN
                      FLODS_101000512_SPECIAL_UP_C00 ON 
                      FLODS_CASE_ENQUIRY_F00.CASE_ENQUIRY_ID = FLODS_101000512_SPECIAL_UP_C00.CASE_ENQUIRY_ID FULL OUTER JOIN

などなど

役立つ場合は、INFORMATION_SCHEMA.COLUMNSからテーブル名と列名を選択できます。私はこれらのテーブルを維持していません。乾杯!

4

1 に答える 1

0

OK、あなたが何をしているのか、なぜそれをしているのか理解できたと思います。良い状況ではないし、何をしてもパフォーマンスは低下しますが、環境を制御できないため、私たちが持っているものをどのように処理するかを考え出さなければなりません。

改善のための提案がいくつかあります。1 つ目は、 COALESCEステートメントを使用することです。これは、null 以外の最初の値を返します。case ステートメントを次のようなものに置き換えることができます。

COALESCE(value1, value2, value3, 'no value')

これにより、最初の null 以外の値が返されます。最後のオプションは、最後の手段として返す文字列です。あなたの文字列は「支払い状況なし」だと思います。

2 番目のオプションは、このロジックを UDF に配置することです。その後、UDF を呼び出して、必要な値を取得できます。これにより、このロジックがすべて抽象化され、よりクリーンになります。それ自体はパフォーマンスが向上するわけではありませんが、よりきれいになります。

3 番目のオプションは、テーブル内の変更されたデータに基づいて更新するある種の一時テーブルを作成することです。折りたたまれたデータを 1 つの大きなテーブルに格納できます。これがオプションであるかどうかはわかりませんが、クエリを実行するたびに作業を行うのではなく、一度作業を行うことでパフォーマンスが向上する可能性があります。

于 2012-04-24T16:27:40.423 に答える