同じ名前の列を持つ複数の表があります。他の多くの表と結合します。次に、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。私はこれらのテーブルを維持していません。乾杯!
いくつか例を挙げてください(簡略化したほうがよいでしょう)?私は、あなたがしようとしていることを私が視覚化できるかどうかはわかりません。 – IAmTimCorey
おそらくあなたのケースステートメントのいくつかを避けるために、COALESCEまたは少なくともISNULLを使用するのに役立つものがあります。 –
テーブルのリストを維持していますか?SQL Serverには何らかの種類の情報スキーマがありますが、レポートテーブルだけでなく、すべての情報スキーマがあることは間違いありません。そして、あなたがやりたいことは可能ですが、コントロールデータを取り出すためのものと、組み立て後に実行するものとの2つのステップで行う必要があります。これは、上位レベルの言語で実行することも、ストアドプロシージャで実行することもできます。これは間接的なものになりがちですが、面倒なこともあります。具体的な例は、これを回避する方法があるかもしれないので、助けになるかもしれません。 –