我有参与者和答案的基表,具有以下结构:
ParticipantId, BusUnitId, QuestionNum, Answer.
在此表中,QuestionNum范围,例如,1到6.我还有另外两个表,它们将QuestionNum链接到实际问题表,BusUnitQuestions和ParticipantQuestions。对于每个QuestionNum,我必须根据QuestionId获得实际的问题文本。
BusUnitId, QuestionId
ParticipantId, QuestionId
现在假设QuestionNum从1到6的记录.BusUnitQuestions有3条记录,因此QuestionNum 1到3必须从BusUnitQuestions加入QuestionId的问题,而QuestionNum 4到6必须从ParticipantQuestions加入QuestionId的问题。我假设我需要在BusUnitQuestions的子查询中使用ROW_NUMBER()来加入我的答案表,但之后我就迷失了。
如果有人理解我,你有什么建议吗?
以下是示例设置。在此,参与者回答了5个问题(1到5)。前三个问题由参与者的部门设定,最后两个由参与者选择。实际上有超过5个问题供部门和参与者选择。我需要使用DepartmentQuestions中的行号和Answers表中与QuestionNum相对应的ParticipantQuestions将Questions表连接到Answers表。
create table Answers (AnswerId int identity(1,1), ParticipantId int, DeptId int, QuestionNum int, AnswerScore int)
create table Dept_Question (DqId int identity(1,1), DeptId int, QuestionId int)
create table Particpant_Question (PqId int identity(1,1), ParticipantId int, QuestionId int)
create table Questions (QuestionId int identity(1,1), QuestionText nvarchar(200))
insert Questions (QuestionText) values ('What is a duck?')
insert Questions (QuestionText) values ('How much do you weigh?')
insert Questions (QuestionText) values ('Why does orange fit?')
insert Questions (QuestionText) values ('Who pokes the fish?')
insert Questions (QuestionText) values ('Why no cow bells?')
insert Dept_Question (DeptId, QuestionId) values (3, 3)
insert Dept_Question (DeptId, QuestionId) values (3, 4)
insert Dept_Question (DeptId, QuestionId) values (3, 1)
insert Particpant_Question(ParticipantId, QuestionId) values (1, 2)
insert Particpant_Question(ParticipantId, QuestionId) values (1, 4)
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 1, 63)
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 2, 89)
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 3, 44)
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 4, 54)
insert Answers (ParticipantId, DeptId, QuestionNum, AnswerScore) values (1, 3, 5, 72)
答案 0 :(得分:1)
根据我的理解,您只有一个答案列表,但问题可能出在几个不同的表中。你可以采用两种方法来获得这个 - 或者使用ISNULL进行几次LEFT JOIN,或者你可以创建一个VIEW,它是你的问题表的UNION并加入到那里。
如果只是这一个查询并且您将来不会添加更多问题类型,那么第一个可能更容易,但如果您要经常这样做(添加问题类型或查询数据),我会选择方法2,因为您只需维护视图而不是原始查询。
方法1:
SELECT a.ParticipantId, a.QuestionId, a.AnswerId, ISNULL(q1.QuestionText, q2.QuestionText, NULL) as QuestionText
FROM Answers a
LEFT
JOIN Question1 q1 /* BusinessUnitQuestions? */
ON a.QuestionId = q1.QuestionId
LEFT
JOIN Question2 q2 /* ParticipantQuestions? */
ON a.QuestionId = q2.QuestionId
这样,无论出现在哪个表格中,都会提取问题文本。
方法2:
首先,使用UNION创建一个包含所有问题的视图,如下所示(根据需要添加更多联合):
CREATE VIEW AllQuestions
AS
SELECT QuestionId, QuestionText
FROM Question1
UNION ALL
SELECT QuestionId, QuestionText
FROM Question2
然后,您可以在第一个查询的简化版本中使用该视图:
SELECT a.ParticipantId, a.QuestionId, a.AnswerId, q.QuestionText
FROM Answers a
JOIN AllQuestions q
ON a.QuestionId = q.QuestionId