2012-04-24 7 views
0

同じ名前の列を持つ複数の表があります。他の多くの表と結合します。次に、Caseを使用してこれらの表からヌル値を省略するためのデータを選択します。ワイルドカードを使用して異なるテーブルから同じ名前の列を選択する

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 

などなど

Iから&列名をテーブル名を選択することができる午前:このことができます場合は、INFORMATION_SCHEMA.COLUMNS。私はこれらのテーブルを維持していません。乾杯!

+1

いくつか例を挙げてください(簡略化したほうがよいでしょう)?私は、あなたがしようとしていることを私が視覚化できるかどうかはわかりません。 – IAmTimCorey

+0

おそらくあなたのケースステートメントのいくつかを避けるために、COALESCEまたは少なくともISNULLを使用するのに役立つものがあります。 –

+0

テーブルのリストを維持していますか?SQL Serverには何らかの種類の情報スキーマがありますが、レポートテーブルだけでなく、すべての情報スキーマがあることは間違いありません。そして、あなたがやりたいことは可能ですが、コントロールデータを取り出すためのものと、組み立て後に実行するものとの2つのステップで行う必要があります。これは、上位レベルの言語で実行することも、ストアドプロシージャで実行することもできます。これは間接的なものになりがちですが、面倒なこともあります。具体的な例は、これを回避する方法があるかもしれないので、助けになるかもしれません。 –

答えて

0

OK、私はあなたが何をしているのか、なぜそれをやっているのか理解していると思います。良い状況ではなく、あなたが何をしてもパフォーマンスは低下しますが、環境を管理することができないため、私たちが持つものをどのように処理するかを把握する必要があります。

改善のための提案がいくつかあります。最初はCOALESCEステートメントを使用することです。これは最初の非NULL値を返します。ケースステートメントを次のように置き換えることができます。

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

これは最初のNULL以外の値を返します。最後のオプションは、最後の手段として返す文字列です。あなたの文字列は「支払いステータスなし」と信じています。

第2のオプションは、このロジックをUDFに配置することです。その後、UDFを呼び出して必要な値を取得することができます。これはこのロジックをすべて抽象化し、より洗練されたものにします。それ以上の演奏はありませんが、それはもっとうまくいくでしょう。

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

+0

こんにちは、私はデータベースが更新されるたびに一時テーブル/ビューを更新するだけで済むので、3番目のオプション(おそらく1番目のオプションとあわせて)が好きです(これは頻繁ではありませんが、 )。私はこのビューに参加するために私のクエリを編集することができたので、私は1つのクエリを更新するだけです - 12とは対照的に...私は、同様の名前のテーブルをすべて照会し、名前。多くのありがとう、ガイ。 – user1354015

関連する問題