例で示すのが最も速いと思うので、ここに私の問題の単純化されたバージョンを示します。SQL Server を使用しています。
これがデータモデルです
SURVEY QUESTION ANSWER
------ -------- -------
surveyId questionId answerId
questionText surveyId
questionId
answerText
ここにいくつかのサンプルデータがあります
SURVEY QUESTION
---------- ------------ --------------
| surveyId | | questionId | questionText |
---------- ------------ --------------
| 1 | | 1 | Name |
| 2 | | 2 | E-Mail |
---------- | 3 | Address |
| 4 | Phone |
------------ --------------
ANSWER
-----------------------------------------------
| answerId | surveyId | questionId | answerText |
-----------------------------------------------
| 1 | 1 | 1 | John |
| 2 | 1 | 2 | john@aa.bb |
| 3 | 1 | 3 | New York |
| 4 | 1 | 4 | 1112223344 |
| 5 | 2 | 1 | Pete |
| 6 | 2 | 2 | pete@cc.dd |
| 7 | 2 | 3 | Boston |
| 8 | 2 | 4 | 5556667788 |
-----------------------------------------------
最後に選びたいのはこちら
RESULT
------------------------------
| surveyId | name | email |
------------------------------
| 1 | John | john@aa.bb |
| 2 | Pete | pete@dd.cc |
------------------------------
最終テーブルに必要な列を実行時に指定できるようにしたいと考えています。今、私は次のことを行うことでこの結果を得ることができます
SELECT rName.surveyId, rName.requestor, rEmail.email
FROM (SELECT a.answerText AS name, a.surveyId
FROM answer a INNER JOIN question q ON a.questionId = q.questionId
WHERE a.surveyId = @surveyId AND q.questionText = 'Name') AS rName
INNER JOIN
(SELECT a.answerText AS name, a.surveyId
FROM answer a INNER JOIN question q ON a.questionId = q.questionId
WHERE a.surveyId = @surveyId AND q.questionText = 'E-Mail') AS rEmail
ON rName.questionnaireId = rEmail.questionnaireId
ご覧のとおり、見苦しく、重複したコードが含まれています。このクリーナーを行う方法はありますか?