gpt4 book ai didi

java - Arraylist 中的数据重复

转载 作者:行者123 更新时间:2023-12-01 19:38:23 25 4
gpt4 key购买 nike

我想用从数据库中选择的数据填充我的 ArrayList,但它重复了我不明白的所有行。

        Connection conn = DriverManager.getConnection(url, userid, password);
String strSql = "SELECT * FROM events, eventStats" ;
PreparedStatement Stmt = conn.prepareStatement(strSql);
ResultSet rs = Stmt.executeQuery(strSql);

while(rs.next()){
Events user = new Events();
user.seteName(rs.getString(2));
user.setePlace(rs.getString(4));
user.seteDate(rs.getString(5));
user.seteInscrit(String.valueOf(rs.getInt(8)));
user.seteTotal(String.valueOf(rs.getFloat(10)));
data.add(user);
}

感谢您的帮助!

最佳答案

您实际上并没有看到严格意义上的“重复”行。

您看到的是一个笛卡尔积,它是一个表中的每一行与另一个表中的每一行的连接。您得到这个是因为您的 SQL 语句中有笛卡尔连接(或者交叉连接,如果您愿意的话):

SELECT * FROM events, eventStats
-- ^^^^^^^^^^^^^^^^^^

这意味着,对于 events 表中的每一行,您将获得的结果数等于 eventStats 表中的行数。将所有这些加在一起,看起来有很多重复项,实际上可能是两个表中所有行集中在一起的大量唯一组合。

在某些情况下需要笛卡尔连接,但它通常是错误查询的指示,并且如果其中一个表特别大,可能会对系统产生巨大的性能影响。1

为了避免这种情况,您需要指定每个表中的哪一列用于通过显式连接将两个表连接在一起:

SELECT *
FROM events v
[INNER|LEFT OUTER|RIGHT OUTER] JOIN eventStats s
ON v.SomeColumn = s.SomeMatchingColumn

或者隐式的:

SELECT *
FROM events v, eventStats s
WHERE v.SomeColumn = s.SomeMatchingColumn

在没有看到表结构的情况下,很难告诉您更多信息,但是这两个表之间可能存在外键关系,而这就是您想要联接的列。

1 笛卡尔连接将返回的行数等于连接中涉及的表大小的乘积。例如,假设 events 表包含 50,000 行,eventStats 表也有 50,000 行,每个事件 一行。通过对这些表进行笛卡尔连接,您的查询将返回高达 2,500,000,000 的数据行,是的,这是 25 亿十亿 行数据。现在想象一下将所有这些读入 ArrayList 中...除非您不能,因为 Java 数组无法变得那么大!在您读取所有数据之前,您的应用程序将崩溃,并出现 java.lang.OutOfMemoryError:请求的数组大小超出 VM 限制java.lang.OutOfMemoryError:Java 堆空间数据输入。

关于java - Arraylist 中的数据重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56564570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com