考虑下表
工作表
JobID AnswerID UserID
1 1,2 1
2 2,3 2
3 1,3 3
答案表
AnswerID Answer QuestionID
1 Clean 1
2 Install 1
3 Other 2
为此,我需要得到如下结果
JobID Answer UserID
1 Clean,Install 1
2 Install,Other 2
3 Clean,Other 3
请帮助为此编写MSSQL查询。
答案 0 :(得分:3)
评论太长了。
您将以逗号分隔列表的形式存储ID列表。出于以下几个原因,这是一个非常糟糕的主意:
有一种在关系数据库中存储列表的正确方法。它被称为“表”。您需要一个每个作业有一行的联结表并回答。我称之为JobAnswers
。
使用适当的数据结构,您的查询将是微不足道的。
答案 1 :(得分:0)
你可以尝试使用这样的subquerys:
SELECT job.jobID, (选择answer.answer FROM answer WHERE answer.answerID IN(job.answerID))作为答案, job.userID
答案 2 :(得分:0)
虽然我同意Gordon Linoff的观点,但我确实理解我们无法控制我们从以前的开发者那里继承的东西。
这是您需要做的事情:
示例数据
CREATE TABLE #temp
(
JobID INT, AnswerID VARCHAR(10), UserID INT
);
INSERT INTO #temp
VALUES
(1, '1,2', 1
),
(2, '2,3', 2
),
(3, '1,3', 3
);
CREATE TABLE #temp2
(
AnswerID INT, Answer VARCHAR(10), QuestionID INT
);
INSERT INTO #temp2
VALUES
(1, 'Clean', 1
),
(2, 'Install', 1
),
(3, 'Other', 2
);
查询:
SELECT #temp.JobID,
(
SELECT #temp2.Answer
FROM #temp2
WHERE #temp2.AnswerID = SUBSTRING(#temp.AnswerID, 1, CHARINDEX(',', #temp.AnswerID)-1)
)+','+
(
SELECT #temp2.Answer
FROM #temp2
WHERE #temp2.AnswerID = SUBSTRING(#temp.AnswerID, CHARINDEX(',', #temp.AnswerID)+1, LEN(#temp.AnswerID)-1)
) AS Answer,
#temp.UserID
FROM #temp;
结果: