2017-01-10 5 views
0

私は、それぞれが1つのテーブルからいくつかのレコードを取得し、それらを「出力テーブル」に追加するいくつかのSQLクエリで構成される巨大な既存のSQLスクリプトをクリーンアップしようとしています。一度にすべてのレコードを取得するために1つのクエリを作成する方がはるかに簡単なようです。問題は、これらの既存のクエリのそれぞれがWHERE句ですべての種類の基準を使用することです。複数のクエリパラメータのテーブルを使用する

すべてのWHERE条件を含むテーブルを作成して、これらの条件をすべて使用するSQL文を作成するだけでよいのだろうかと思います。その後、基準を変更する必要がある場合は、そのテーブルを編集または追加するだけで、SQLを再実行する必要はありません。例えば

が、今それはのようなものです:

INSERT INTO SelectedCustomers (CustomerID) 
SELECT CustomerID FROM Customers WHERE CustomerName LIKE '%Jones%' AND CustomerAge > '18' 

その後さらにあります沿っ:

INSERT INTO SelectedCustomers (CustomerID) 
SELECT CustomerID FROM Customers WHERE CustomerState = 'CT' OR CustomerHair = 'Brown' 

とダウン、さらに、次のとおりです。

INSERT INTO SelectedCustomers (CustomerID) 
SELECT CustomerID FROM Customers WHERE CustomerState = 'NY' AND CustomerHair <> 'Red' 

など(それが上になり、 on ...)

アイデアやリンクなど?

+0

これを1つのステートメントに組み込むか、または「別のテーブル」に条件を入れたいのですか? – Hogan

+1

条件をテーブルに保存する方法。これには '動的SQL 'が必要です。WHERE顧客名LIKE「%ジョーンズ%」AND CustomerAge>「18」 UNION顧客からSelectedCustomers(得意先) ( SELECT得意INTO INSERT:あなただけの書き込みと同じだテーブル –

答えて

0

これを行うにはいくつかの方法があります。基準が常に同じ場合(たとえばLIKE '%Jones%'またはCustomerAge > '18')、内部結合について話しています。あなたの基準以来

私がいることを示唆していますたくさん変わるようです(これは、動的SQLで行うことができますが、私の意見では、これはちょうどあなたのシステムが維持することが困難と遅くなりますが。)

代わりに、私は希望あなたの例では、1つのテーブルのIDに基づいた選択だけが表示され、そのビューに基づいて挿入テーブルの結合が表示されるためです。条件を変更すると、ビューが変更されます。それはこのようになります。

CREATE OR REPLACE VIEW INSERT_CRITERIA (CustomerID) AS 

    SELECT CustomerID FROM Customers WHERE CustomerName LIKE '%Jones%' AND CustomerAge > '18' 
     UNION 
    SELECT CustomerID FROM Customers WHERE CustomerState = 'CT' OR CustomerHair = 'Brown' 
     UNION 
    SELECT CustomerID FROM Customers WHERE CustomerState = 'NY' AND CustomerHair <> 'Red' 

その後、インサートは、ここでの利点は、まだコンパイラであるという利点を取得中にあなたが管理しやすいとモニタの場所にあなたのビジネスルール(例えばCustomerState = 'CT')を取り除くことだけ

INSERT INTO SelectedCustomers (CustomerID) 
    SELECT CustomerID FROM INSERT_CRITERIA 

ですそれらの機能を最適化することができます。

実際に自動化したい場合は、このビューを提案します。ビジネスルールを格納しているテーブルからビューを生成するだけです。ビューの作成/更新は簡単にスクリプト化できます。

+0

に格納されているかの条件を示すために必要がありますCustomerState = 'CT' OR CustomerHair = 'ブラウン UNIONがCustomerState = 'NY' AND CustomerHair <> '赤' 顧客から得意先を選択 お客様) FROM SELECT得意先が、私は一種のやることを望んでいたものWHERE句のすべての値に対してTABLEを使用するので、SQL自体をもう編集する必要がなくなり、一部のテーブルの値を変更するだけです。 –

+0

@BrianBattles - そうではありません。しかし、心配の*分離を作成する*あなたは今あなたのデザインを強化しました。これはモジュラープログラミングの基本です。たとえば、テーブルからのビューの作成をスクリプト化することができます。ビューのロジックがストアドプロシージャにまだ含まれていた場合は、はるかに難しくなるでしょう。 – Hogan

+0

まあ、ホーガン、このクエリ(とデータベース全体)の設計は、私がこの会社に着く前に数年前に作成された災害です。私はそれを解くとそれを修正しようとしている! :) –

関連する問題