SELECT然后UPDATE来自RESULTSET的所有行

时间:2010-12-02 13:33:31

标签: java sql mysql

我想在一个RESULTSET个查询中更新SELECTUPDATE的所有行。

这是我到目前为止所提出的:

SELECT id_queue, status FROM table WHERE status IN (0,2) ORDER BY status, id_queue ASC FOR UPDATE;

UPDATE table SET status = 97 WHERE id_queue= " + id_combined + ";

所以,我想我需要把所有id_queue个ID,像1,2,3,4,5,6,7,8一样放到id_combined

有任何想法在JAVA中做到这一点的最佳方法吗?

注意:我不只是尝试使用状态0&更新所有内容。 2到97,我想在其他地方使用select resultset。

5 个答案:

答案 0 :(得分:5)

不确定您使用的是哪种SQL方言,但这值得一试:

update table set status = 97 where ID_queue in
(SELECT id_queue FROM table WHERE status IN (0,2))

答案 1 :(得分:1)

执行此操作的一种方法是嵌套查询。也就是说,你可以在你的UPDATE中放入一个SELECT,如下所示:

UPDATE table SET status = 97 WHERE id_queue IN (SELECT id_queue
                                                FROM table
                                                WHERE status IN(0,2))

Google for sql'nested query'或'subquery'获取更多信息。

答案 2 :(得分:1)

使用StringBuilder收集ResultSet中返回的ID号,然后使用此号码构建更新查询。

首先,执行查询并收集ID。

StringBuilder ids = new StringBuilder();

Statement statement = this.conn.createStatement();
statement.executeQuery("SELECT id_queue, status FROM table WHERE status IN (0,2) ORDER BY status, id_queue ASC;");
ResultSet rs = statement.getResultSet();
while (rs.next()) {
  if (ids.length() > 0)
    ids.append(',');
  ids.append(rs.getInt("id_queue"));
}

// use the resultset for whatever else you want

rs.close();

然后,执行更新。

if (ids.length() > 0) {
  statement = this.conn.createStatement();
  statement.executeUpdate("UPDATE table SET status = 97 WHERE id_queue In ("+ids.toString()+");");
}

答案 3 :(得分:0)

我的想法是(不工作代码)

List<Integer> ids = new ArrayList<Integer>();
for(Row row : ResultSet.rows()) {
    ids.add(row.get("id_queue");
}
String sql = "UPDATE table SET status = 97 WHERE id_queue IN (" + 
             StringUtils.join(ids, ",") + 
             ")";

使用StringUtils class from Apache

显然,既然你说你不想将ResultSet中的所有项目转换为状态97:

  • 您不能只有一个同时执行SELECT / SET的SQL查询(除非您可以在SQL中制定附加条件是什么),并且
  • 您需要修改for循环以仅选择实际要修改的行

为了完整起见,以下内容将使用纯SQL进行更新(如果您想修改所有行)

UPDATE table SET status = 97
WHERE status IN (0,2)

答案 4 :(得分:0)

为了避免错误,您需要为SELECT语句指定别名: 试试这个: UPDATE表SET status = 97 WHERE id_queue IN(SELECT * FROM(SELECT id_queue                                                 从表                                                 WHERE状态IN(0,2))MyResult) MyResult是选择查询的别名