如何将多个"SELECT"语句合并为一个?

Ran*_*ian 1 java sql-server select

目前,我正在使用for循环,当orgList内部有数千个元素时,速度慢得令人无法接受:

String sql = "SELECT xua.XUAID, xua.XUA01, xua.XUA02 "
            + "FROM dbo.XDSysUseArea xua "
            + "WHERE xua.XUA03=?";

conn = ds.getConnection();
ps = conn.prepareStatement(sql);

for(HotelSource org : orgList) {
    ps.setString(1, org.getPrimaryKey());
    rs = ps.executeQuery();

    while (rs.next()) {
        // do sth
    }
}
Run Code Online (Sandbox Code Playgroud)

做正确的方法是什么SELECT

Dav*_*idG 5

您应该使用SQL IN,例如:

SELECT ... FROM ... WHERE xua.XUA03 IN (x, y, z, ...)
Run Code Online (Sandbox Code Playgroud)

您仍然可以参数化您的查询,但您需要?在语句中生成正确的数字.所以这里有一些伪代码,因为我不做Java:

String params = "?, ?, ?, ?"; //you will have to generate enough of these yourself
                              //This is an exercise for you!

String sql = "SELECT xua.XUAID, xua.XUA01, xua.XUA02 "
            + "FROM dbo.XDSysUseArea xua "
            + "WHERE xua.XUA03 IN (" + params + ")";

conn = ds.getConnection();
ps = conn.prepareStatement(sql);

int index = 1;

for(HotelSource org : orgList) {
    ps.setString(index, org.getPrimaryKey());
    //           ^^^^^ use index here

    index++;
}

rs = ps.executeQuery();
while (rs.next()) {
    // do sth
}
Run Code Online (Sandbox Code Playgroud)

注意:这样做的缺点是你提到你有成千上万的条目,orgList这使得使用这种方法真的很糟糕.实际上,SQL Server不允许您使用超过几千个参数.