簡體   English   中英

Java遍歷多個SQL查詢

[英]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來執行其工作並確定最好的方式以拉回數據,而不是顯式確定要首先使用的表,然后一次調用它們一次更好。將來要花很多時間才能獲得結果,代碼可讀性和可維護性。

您正在尋找什么信息

在您提供的偽代碼中,您正在使用KeywordQuestionAnswerAnswerRating值。 查找這些值應該是sql查詢的重點。 根據您編寫的代碼, QuestionAnswerAnswerRating來自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效率更高。

我懷疑您之前(可能是您提供的)查詢方面存在問題,因為您沒有提供任何信息來將TaskQuestionsTasks一起加入。 那很可能導致重復。 我加入了TaskNo但是根據表的設置,這可能不是正確的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM