使用sql中的“从平均值计算”更新所有列行
我有一个数组,它从数据库中的列中获取值使用sql中的“从平均值计算”更新所有列行,sql,arrays,sqlite,Sql,Arrays,Sqlite,我有一个数组,它从数据库中的列中获取值 String sql1 = "SELECT COUNT(DISTINCT Total) AS Rank FROM class1 s1 JOIN class1 s2 ON (s1.Total <= s2.Total) GROUP BY s1.ID ORDER BY s1.Name ASC"; pst = conn.prepareStatement(sql1); rs = pst.executeQuery(); ArrayList<Strin
String sql1 = "SELECT COUNT(DISTINCT Total) AS Rank FROM class1 s1 JOIN
class1 s2 ON (s1.Total <= s2.Total) GROUP BY s1.ID ORDER BY s1.Name ASC";
pst = conn.prepareStatement(sql1);
rs = pst.executeQuery();
ArrayList<String> marks = new ArrayList<>();
while (rs.next()) {
marks.add(rs.getString(1));
}
String[] order = new String[marks.listIterator().nextIndex()];
order = marks.toArray(order);
但当我尝试时,我的桌子是这样的:
| NAME | SCORE 1 | SCORE 2 | TOTAL | POSITION |
--------+---------+---------+--------+-----------+
| james | 10.0 | 24.0 | 34.0 | [1,2,3] |
| jimmy | 10.0 | 20.0 | 30.0 | [1,2,3] |
| josh | 10.0 | 19.0 | 29.0 | [1,2,3] |
这是我编写的用数组更新“位置列”的代码
String sql1="SELECT COUNT(DISTINCT Total)AS Rank from class1 s1 JOIN class1
s2 on(s1.Total<=s2.Total) GROUP BY s1.ID order by s1.Name ASC";
pst = conn.prepareStatement(sql1);
rs = pst.executeQuery();
ArrayList<String> marks = new ArrayList<>();
while (rs.next()) {
marks.add(rs.getString(1));
}
String[] order = new String[marks.listIterator().nextIndex()];
order = marks.toArray(order);
String sql = "update class1 set Position ='"+Arrays.toString(order)+"'";
pst = conn.prepareStatement(sql);
pst.execute();
String sql1=“选择COUNT(DISTINCT Total)作为class1 s1 JOIN class1中的秩
s2 on(s1.Total您希望为不同的行设置单独的值,但语句
String sql = "update class1 set Position ='"+Arrays.toString(order)+"'";
将为所有行的Position列设置相同的值,此处为数组。toString(order)
将给出值[1,2,3]
,因此表的最终结果是所有列的Position列都具有值[1,2,3]
为了正确地更新各行,我们需要传递每行的唯一标识符来更新位置
伪代码:
Together with the Rank count in your select query, select unique id for each row, with the help of unique_id for each row only we will be able to update the exact row in the table. Please modify the column names matching to your table declaration
String sql1 = SELECT COUNT(DISTINCT s2.Total) AS Rank from class1 s1
JOIN class1 s2 on (s1.Total<=s2.Total)
GROUP BY s1.ID order by s1.Name ASC;
pst = conn.prepareStatement(sql1);
rs = pst.executeQuery();
String sql = "";
while (rs.next()) {
String sql = "update class1 set Position ='"+rs.getString(2)+"'"+"WHERE unique_id="+rs.getString(1);
pst = conn.prepareStatement(sql);
pst.execute();
}
与select查询中的秩计数一起,为每一行选择唯一id,借助每一行的唯一id,我们将能够更新表中的确切行。请修改与表声明匹配的列名
字符串sql1=选择COUNT(DISTINCT s2.Total)作为class1 s1的秩
加入(s1)上的class1 s2。非常感谢你Clement Amarnath…你的解决方案是正确的。我只需将update语句中的值从1更改为2,从0更改为1。
第一个是:
String sql = "update class1 set Position ='"+rs.getString(1)+"'"+"WHERE unique_id="+rs.getString(0);
pst = conn.prepareStatement(sql);
pst.execute();
sqlite3似乎有一种不同的索引默认行的方法…所以我改变了这种方法
String sql = "update class1 set Position ='"+rs.getString(2)+"'"+"WHERE unique_id="+rs.getString(1);
pst = conn.prepareStatement(sql);
pst.execute();
非常感谢。祝您好运..您使用的是哪种dbms?我使用的是带netbeans的sqlite3 ideSQLite不支持数组。非常感谢您Clement..我已经修改了表名,但仍然得到一个异常,即..“java.sql.SQLException:列0超出范围[1,2]“。是否有办法解决此问题。唯一的修改是在sql select语句中,它的-count(DISTINCT s2.Total)作为秩-。因此,创建计算列(秩)的语句将是:String sql1=select count(DISTINCT s2.Total)作为等级从1级s1加入1级s2(s1。Total@RodneyNart-很高兴听到答案帮助您解决了问题,我也根据您的评论修改了答案。但是,是否有办法将字符串变量附加到更新列中的值,以便在位置列中,我的结果类似于“1”、“2”、“3”、“4”…而不是1,2,3,4
String sql = "update class1 set Position ='"+rs.getString(2)+"'"+"WHERE unique_id="+rs.getString(1);
pst = conn.prepareStatement(sql);
pst.execute();