0

2 つのテーブルがあり、1 つには質問が含まれています (「テンプレート」と見なされます)。

|QuestionID|QuestionText      |
|----------|------------------|
|1         |What is your name?|
|2         |What is your age? |
|-----------------------------|

そして、これらの質問への回答を含むもので、別の顧客 ID 値をキーとしています。

|CustID    |QuestionID|Answer |
|----------|------------------|
|1000      |1         |John   |
|1000      |2         |22     |
|2000      |1         |Alice  |
|-----------------------------|

ご覧のとおり、顧客 #1000 は質問 1 と 2 に回答し、顧客 #2000 は質問 1 のみに回答しました。

これらを顧客が Web ページのグリッドにロードする必要があり、テンプレートと回答テーブルの間で左外部結合を実行して、次のようなものを取得するだけでよいと考えました。

|CustID    |QuestionID|Answer |
|----------|------------------|
|2000      |1         |Alice  |
|2000      |2         |<null> |
|-----------------------------|

したがって、この場合、カスタマー #2000 はAnswer質問 #2 の列を null として返し、アプリケーションは回答が必要であることを認識します。これは私が試した SQL の例ですが、に使用するなどOUTERの組み合わせがいくつあっても、単一のクエリでこれを機能させることはできません。LEFTJOIN

select 
    q.QuestionID,
    q.QuestionText,
    a.CustID,
    a.Answer,
from 
    SurveyAnswers a  
        full outer join SurveyQuestions q
        on a.QuestionID = q.QuestionID
    where 
        a.CustID = @CustomerID

基本的に、テーブル内のすべてのレコードと、CustomerID に一致するすべてのレコードの列の値が必要です。SurveyQuestionsAnswerSurveyAnswers

代わりに、 で の 1 つのレコードを取得するだけで、SurveyAnswersその結果、 で一致 (だと思いますか?) となりSurveyQuestionsます。私の SQL-fu は強力ではありません。

私も試しUNIONてみましたが、2つのテーブルの構造が異なるため、うまく機能しませんでした。

もちろん、質問と回答を別々に取得して、C# コードで「合体」を実行することもできますが、ストアド プロシージャから直接実行できるかどうかを確認したかったのです。ありがとう!

4

1 に答える 1

1

あなたが抱えている問題は、不一致の行 (例の質問 2) での外部結合の後、不一致のテーブル (SurveyAnswers) のその行のすべての列が NULL と評価されることです。これには CustId 列が含まれます。後で実行される WHERE は NULL = @CustomerId を認識し、その行を除外します。これを修正するには、条件を結合句に移動する必要があります。そのため、「@CustomerId」で与えられた回答が存在する場合は、すべての質問をまとめて SQL Server に問い合わせる必要があります。クエリは (すべての質問とそのすべての回答) を求めていますが、「@CustomerId」が回答したレコードのみを返します。

SELECT 
    q.QuestionID,
    q.QuestionText,
    a.CustID,
    a.Answer,
FROM 
    SurveyAnswers a  
        RIGHT outer join SurveyQuestions q
        on a.QuestionID = q.QuestionID
    AND
        a.CustID = @CustomerID;

トリックを行う必要があります。

于 2012-10-15T22:21:33.413 に答える