在SQL中进行连接时将表显示为对象

时间:2015-01-28 15:13:27

标签: sql sql-server json

所以我有以下SQL从三个表中提取数据:

SELECT * FROM QuizQuestions qq
INNER JOIN LNK_Quiz_QuizQuestion lqq ON qq.QuizQuestionID = lqq.QuizQuestionID 
INNER JOIN Quiz q ON lqq.QuizID = q.QuizID
WHERE q.QuizID = 4

因此它基本上通过链接表获取属于测验的问题列表。

在解析为JSON时给我以下结果 http://pastebin.com/Jf19axDs

但是因为我希望所有列和一些列具有相同的名称,所以响应具有一些重复的值,例如"IsEditable": [false, true],

这真的很糟糕,因为我需要知道Quiz或QuizQuestion是否可编辑,并且我想知道它所属的对象。

因此SQL的理想回报将是:

{
    "Quiz": {
        "IsEditable": false
    },
    "QuizQuestion": {
        "IsEditable": true
    }
}, {
    "Quiz": {
        "IsEditable": false
    },
    "QuizQuestion": {
        "IsEditable": true
    }
}

我如何用SQL实现这一目标?我使用的是SQL Server。


注意:关于使用SELECT *这是为了便于在此示例中使用,并且不应该是问题的原因,因为即使我将列命名为:

SELECT q.IsEditable, qq.IsEditable

返回

"IsEditable": [false, true]

或者甚至给他们别名:

SELECT q.IsEditable AS QuizIsEditable, qq.IsEditable AS QuizQuestionIsEditable

返回

"QuizIsEditable": false,
"QuizQuestionIsEditable": true

更新:在考虑了这个之后,似乎我需要拆分SQL查询然后分别创建每个对象。这是正确的吗?

1 个答案:

答案 0 :(得分:1)

你将不得不将其分解为2个查询,没有办法解决它。您将无法只对数据库中的原始结果进行json编码。首先选择测验作为应用程序中的对象,为其提供“问题”属性,其值将是第二个查询的结果,以获取所有问题。把它解析成json,你应该很好。

SELECT * FROM Quiz WHERE QuizID = 4;

这产生了一些像这样的对象:

var quizQueryResult = db.execute("SELECT * FROM Quiz WHERE QuizID = 4;")

// returns something like this, 
// an array of result objects: [{QuizID: 4, IsEditable: true, etc...}];
var myQuiz = queryResult[0]; //the only result from the DB

var questionsQueryResult = db.execute("SELECT qq.* FROM QuizQuestions qq 
    JOIN LNK_Quiz_QuizQuestion lqq ON qq.QuizQuestionID = lqq.QuizQuestionID 
    WHERE lqq.QuizID = 4;");

// questionsQueryResult is now an array or some collection of QuizQuestions.

myQuiz.Questions = questionsQueryResult;
response.Body = jsonEconde(myQuiz);