[英]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.