mysql
  • sql
  • oracle
  • 2013-02-06 44 views 0 likes 
    0

    我正在使用select查詢從表中按名稱選擇特定記錄。該表由超過25000條記錄組成。使用選擇查詢問題

    表格式

    |rcode|rname|vcode|vname|div_sec|ofrn|phone|dat| 
    

    此外,也可以包含具有相同名稱的多個記錄..我用下面的查詢

    ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'"); 
    if(rs.next()) 
    { 
        rcode=rs.getString("rcode"); 
        out.print(rcode); 
        out.print(" "); 
    } 
    

    我必須找出RCODE給定的rname。現在,通過使用上述查詢的問題是,如果我搜索名稱爲「坎南」記錄表中包含名爲「坎南」作爲

    10001 kannan 
    10089 kannan 
    11826 kannan 
    12241 kannan 
    12389 kannan 
    19926 kannan 
    

    6條現在,我的查詢只取第一個記錄,給出的結果RCODE = 「10001」

    如果我使用

    while(rs.next()) 
    { 
        rcode=rs.getString("rcode"); 
        out.print(rcode); 
        out.print(" "); 
    } 
    

    將只打印最後一個記錄RCODE = 「19926」。假設我想用rcode 12241獲取「kannan」的記錄,那麼如何修改查詢以獲取記錄?請注意,我只能使用rname來獲取詳細信息。

    有沒有解決這個問題的方法?有人請幫我

    +1

    否。沒有解決方案來解決這個問題。關係數據庫管理系統的開發者從未想到用戶可能想要以某種方式關聯兩條信息。哦,等待... – Strawberry

    +0

    哦,那我該如何解決這個問題?任何想法 –

    +0

    只需將表加入自己... FROM my_table x JOIN my_table y ON y.something = x.something ... – Strawberry

    回答

    2

    其實第二個片段應該輸出所有記錄的kannan記錄,除非你錯寫了它。 將輸出最後:

    while(rs.next()) { 
        rcode=rs.getString("rcode"); 
    } 
    out.print(rcode); 
    out.print(" "); 
    

    理想的解決辦法是改變基於兩列的查詢來限制:

    select * from newfarmer where rname = 'kannan' and rcode = '12241' 
    

    但是,因爲你解僱,作爲一個可能性,你必須全部得到它們並篩選出你想要的東西(然而與使DBMS做到這一點相比,效率低下)。換句話說,這樣的:

    while(rs.next()) { 
        rcode=rs.getString("rcode"); 
        if (rcode == "12241") {  // or some other identifying condition. 
         out.print(rcode); 
         out.print(" "); 
        } 
    } 
    

    我的建議是回去重新審視你的需要只能通過rname得到記錄。這似乎是一個奇怪的限制,使得任何解決方案都遠不如其他方式那樣優化。

    +0

    但我需要獲取rcode。我不知道rcode。所以我不能在我的查詢 –

    +0

    @ ling.s中使用它,你要麼提前知道rcode(在這種情況下使用它),要麼你不知道。如果你不這樣做,你必須獲取'kannan'記錄來試圖找出哪個是正確的。想想你有什麼方法可以確定一旦你擁有了正確的「kannan」記錄。 – paxdiablo

    +0

    實際上我需要在用戶選擇名稱時檢索記錄 –

    1

    第二次剪切將肯定會檢索ResultSet中的所有行,但請注意,除非您在SQL中提供order by子句,否則沒有記錄的保證順序。也許這就是爲什麼你認爲這只是最後一次 - 你只看到返回的第一行,發現它是你最後期望的id,而忽略其餘的。只是一種可能性。

    在rname列上有索引嗎?否則,查詢將會非常緩慢。

    而且,這樣的:

    ResultSet rs=stmt.executeQuery("select * from newfarmer where rname='"+get+"'"); 
    

    是一個很大的,公開邀請到SQL注入攻擊。 Insead在準備好的聲明中使用參數:

    //Just prepare the statement once for multiple uses: 
    Statement stmt = conn.prepareStatement("select * from newfarmer where rname=?"); 
    
    //use it: 
    stmt.setString(1, name); 
    ResultSet rs = stmt.execute(); 
    // etc... 
    
    相關問題