我认为通过示例来展示会是最快的,所以这里有一个我的问题的简化版本。我正在使用 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
如您所见,它很丑陋,并且包含重复的代码。有没有办法做这个清洁?