2016-05-10 5 views
1

多くのフィールドのいずれかの回答に基づいて、セカンダリテーブルからレコードを選択するためにSQLでクエリを実行しようとしています。特定のフィールドはレコードごとに異なりますので、私は第二のクエリでCOLUMNタイトルとして最初のクエリのVALUEを使用する必要があります。サブクエリの列名として1つのフィールドの値を使用する

PassID | PassType | PersonID | 
1  | 3   | 54  | 
2  | 4   | 59  | 

資格に必要な表:

PassType | QualificationField | QualificationAnswer 
3   | Q8     | Yes 
4   | Q3     | All 

パーソン表:

PersonID | Name |...| Q3 |...| Q8 
54  | John |...| Non |...| No 
59  | Jane |...| ALL |...| No 

Essent

は、私は(この例では単純化)3台

パステーブルを持っています私が決定する必要があるのは、彼らが割り当てられたパスに基づいて適格基準を持っていれば、それぞれの人のためです。

テーブルは実際ははるかに大きなシステムの一部であり、personテーブルの列はデータベースのさまざまな反復で動的に追加できるため、テーブル構造を大幅に変更することはできません。どの人がこの「何かの余分なもの」に適格であるかを判断するために、SQLクエリで答えます。

私はすでに私の一つの出力で、次のフィールドを与えるために、パスの種類と資格要件に合致するクエリ(Q_PersonWithPass)を持っている:私は今行う必要がある

PersonID | PassType | QualificationField | QualificationAnswer 
54  | 3  | Q8     | Yes 
59  | 4  | Q3     | All 

何が上のサブクエリを実行していますpersonテーブルを使用してQualificationFieldの回答に基づいてカラムを検索し、PersonテーブルのフィールドがQualificationAnswerと一致するかどうかを確認します。

私はこれを試してみた:

SELECT  PersonID, PassType, QualificationField, QualificationAnswer, 
       (SELECT dbo.Q_PersonWithPass.QualificationField 
       FROM dbo.Person 
       WHERE (PersonID = dbo.Q_PersonWithPass.PersonID)) AS QualFld 
FROM   dbo.Q_PersonWithPass 

は、このように単に「Q8」またはQualFldで「Q3」ではなく答え、「いいえ」または「すべて」

を表示するには、方法私はありますサブクエリ内の変数ではなく列タイトルとして 'dbo.Q_PersonWithPass.QualificationField'の値をSQLに認識させることができますか?

+0

私はそれが可能ではないと思います。 – ATC

+0

動的SQLクエリhttp://www.kodyazを構築することができます。com/articles/build-sql-server-dynamic-sql-query-example.aspxを実行し、最後のクエリ文字列をsp_executesqlで実行してください – Eralper

答えて

0

答えの下のコメントの1つで述べたように、私はあなたが望むことをする唯一の方法は、動的SQLクエリを生成することだと思います。以下のコードはキーストロークには完全ではないかもしれませんが、何をすべきかのアイデアを与えるはずです。

考えられるすべての修飾フィールドを取り除き、一時テーブルに挿入し、使用可能なすべてのオプションに基づいてcase文を動的に作成するという考え方です。

Select Distinct QualificationField 
    Into #TEMPTABLE 
    From dbo.Q_PersonWithPass; 

DECLARE 
@SQLQuery nvarchar(4000), 
@QField nvarchar(10) 
BEGIN 

Set @SQLQuery = 'select PWP.PersonId, PWP.PassType, PWP.QualificationField, PWP.QualificationAnswer, Case '; 

While EXISTS(Select * from #TEMPTABLE) 
Begin 
    Select Top 1 @QField = QualificationField From #TEMPTABLE; 
    Set @SQLQuery = @SQLQuery + 'When PWP.QualificationField = ' + @QField + ' Then P.' + @QFIELD + ' '; 
    Delete from #TEMPTABLE Where QualificationField = @QField; 
End 

Set @SQLQuery = @SQLQuery + ' end AS QualFld FROM dbo.Q_PersonWithPass PWP JOIN dbo.Person P on P.PersonID = PWP.PersonID'; 

EXECUTE sp_executesql @SQLQuery 

END; 

問題がある場合は教えてください。

+0

こんにちは - ありがとう!私は動的SQLで遊んだけど、それをうまく使用していないので、うまく動作するようには見えませんでした。 私はあなたのコードを編集しなければなりませんでした。 'PWP.QualificationField = '+ @QField +''の引用符は 'PWP.QualificationField = '' '+ @QField +' '' 'にする必要がありましたがそれはすごくうまくいった! おかあさん – Matt

+0

あなたは、@ SQLQuery変数に実行したいSQL文を作成しようとしています。最後に実行してください。 – MightyRearranger

+0

最後のEndステートメントの前に 'print @SQLQuery'を追加すると、クエリが実行しようとしているものが表示されます。今すぐ試してみるとエラーメッセージが表示されたり、まったく動作していないのかどうか分かりません。 – MightyRearranger

0

確かに結果として何が欲しいのですが、CASEを使って何をしようとしているのかを達成することができます。これに沿った何か:

SELECT PersonID, PassType, QualificationField, QualificationAnswer, 
    (CASE When p.PersonID = dbo.Q_PersonWithPass.PersonID then 'Yes' 
    else 'No' end) ASQualFld 
    FROM dbo.Q_PersonWithPass LEFT JOIN Person p on p.PersonID = dbo.Q_PersonWithPass.PersonID 
+0

質問では、列をPersonテーブルに動的に追加することができます。これが起こっているとすれば、動作することが保証されている明示的なケースステートメントを書くことができないと思いますか? – MightyRearranger

関連する問題