根据ID从2个表中获取值

时间:2016-02-11 16:45:01

标签: sql sql-server

考虑下表

工作表

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查询。

3 个答案:

答案 0 :(得分:3)

评论太长了。

您将以逗号分隔列表的形式存储ID列表。出于以下几个原因,这是一个非常糟糕的主意:

  • 将数字存储为字符串是一个坏主意。
  • 您无法定义外键关系。
  • SQL对字符串没有很好的支持。
  • 由于类型转换,任何加入原始表的尝试效率都会很低。
  • 这样的结构违反了列包含单个值的想法。

有一种在关系数据库中存储列表的正确方法。它被称为“表”。您需要一个每个作业有一行的联结表并回答。我称之为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;

结果:

enter image description here