[英]java looping through multiple sql queries
我试图遍历已执行的多个sql查询。 我想首先获取某个任务的所有问题信息,然后获取该问题的关键字。 我的Questions表中有3条记录,但是当while循环在list.add(keyword);
的末尾时list.add(keyword);
完成后,它跳到SELECT Questions.Question
循环(应如此),然后跳出并只给我一条记录,而没有给我另外2条记录。
我究竟做错了什么? 有人可以帮我修复我的代码吗? 我曾考虑过执行批处理sql(也许是解决方案),但是在每个while循环中,我需要来自先前sql语句的信息,所以我不能只在批处理结束时就做所有事情。
SQL代码:
String TaskTopic = eElement.getElementsByTagName("TaskTopic").item(0).getTextContent();
// perform query on database and retrieve results
String sql = "SELECT Tasks.TaskNo FROM Tasks WHERE Tasks.TaskTopic = '" + TaskTopic + "';";
System.out.println(" Performing query, sql = " + sql);
result = stmt.executeQuery(sql);
Document doc2 = x.createDoc();
Element feedback = doc2.createElement("Results");
while (result.next())
{
String TaskNo = result.getString("TaskNo");
// perform query on database and retrieve results
String sqlquery = "SELECT Questions.Question, Questions.Answer, Questions.AverageRating, Questions.AverageRating\n" +
"FROM Questions\n" +
"INNER JOIN TaskQuestions ON TaskQuestions.QuestionID = Questions.QuestionID \n" +
"INNER JOIN Tasks ON Tasks.TaskNo = '" + TaskNo + "';";
result = stmt.executeQuery(sqlquery);
while (result.next())
{
String Question = result.getString("Question");
String Answer = result.getString("Answer");
String AverageRating = result.getString("AverageRating");
String sqlID = "SELECT QuestionID FROM Questions WHERE Question = '" + Question + "';";
result = stmt.executeQuery(sqlID);
while (result.next())
{
String ID = result.getString("QuestionID");
String sqlKeywords = "SELECT Keyword FROM LinkedTo WHERE QuestionID = '" + ID + "';";
result = stmt.executeQuery(sqlKeywords);
while (result.next())
{
String keyword = result.getString("Keyword");
list.add(keyword);
}
}
feedback.appendChild(x.CreateQuestionKeyword(doc2, Question, Answer, AverageRating, list));
}
}
为什么要在SQL中完成
与编写sql查询相比,创建循环的效率成倍降低。 Sql的构建是为了拉回此类数据,并且可以计划如何从数据库中获取此数据(称为执行计划)。
就您将使用的资源量,如何使用,如何允许Sql来执行其工作并确定最好的方式以拉回数据,而不是显式确定要首先使用的表,然后一次调用它们一次更好。将来要花很多时间才能获得结果,代码可读性和可维护性。
您正在寻找什么信息
在您提供的伪代码中,您正在使用Keyword
, Question
, Answer
和AnswerRating
值。 查找这些值应该是sql查询的重点。 根据您编写的代码, Question
, Answer
和AnswerRating
来自Questions
表,而Keyword
来自LinkedTo
表,因此这两个表都应该可用以从中提取数据。
您可以在这一点上注意到,我们基本上已经映射出查询的“ Select
和“ From
部分的外观。
看起来您有一个名为TaskTopic
的参数,因此我们需要包含Tasks
表以确保返回正确的数据。 最后, TaskQuestions
表是任务和问题之间的链接。 现在我们知道了查询的外观,让我们看看使用sql语法的结果。
编码
您没有包括stmt
的声明,但我假设它是PreparedStatement。 您可以将参数添加到准备好的语句中。 请注意?
在SQL代码? 您提供的参数将代替?
。 为此,您应该使用stmt.setString(1, TaskTopic);
。 请注意,如果有多个参数,则需要按照它们在sql查询中存在的顺序添加它们(使用1、2,...)
SELECT l.Keyword,
q.Question,
q.Answer,
q.AverageRating
FROM LinkedTo l Inner Join
Questions q
on l.questionID = q.QuestionID
Where exists ( Select 1
From TaskQuestions tq INNER JOIN
Tasks t
on tq.TaskNo = t.TaskNo
Where t.TaskTopic = ?
and tq.QuestionID = q.QuestionID)
这是您可以编写查询以返回相同结果的一种方式。 还有其他方法可以编写此代码以获取所需的内容。
这是怎么回事?
您可能不熟悉此查询中的一些内容。 首先是表别名。 您可以为表加上别名,而不必一遍又一遍地写表名。 我用字母q代表Questions
表。 任何时候看到q.
您应该认识到我指的是Questions
一列。 Questions
后面的q是什么赋予表别名。
Exists
而不是对您没有从中选择信息的表进行一堆内部联接,您可以使用一个存在项来检查您要查找的内容是否在那些表中。 如果您需要表中的数据,则可以继续执行内部联接,但是如果不需要,则Exists
效率更高。
我怀疑您之前(可能是您提供的)查询方面存在问题,因为您没有提供任何信息来将TaskQuestions
和Tasks
一起加入。 那很可能导致重复。 我加入了TaskNo
但是根据表的设置,这可能不是正确的列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.