奇怪的AS400数据库

select [color=red]distinct [/color]userpo1_.ID as ID60_, userpo1_.CUST_ID as CUST2_60_, userpo1_.CARD_TYPE as CARD3_60_, userpo1_.USER_CODE as USER4_60_, userpo1_.LOGIN_PASS as LOGIN5_60_, userpo1_.LOGIN_NAME as LOGIN6_60_, userpo1_.USER_NAME as USER7_60_, userpo1_.GENDER as GENDER60_, userpo1_.CARD_CODE as CARD9_60_, userpo1_.IDENTITY as IDENTITY60_, userpo1_.TEL1 as TEL11_60_, userpo1_.TEL2 as TEL12_60_, userpo1_.REC_FLAG as REC13_60_, userpo1_.CHK_FLAG as CHK14_60_, userpo1_.OPT_TYPE as OPT15_60_, userpo1_.OPT_USERID as OPT16_60_, userpo1_.CHK_USERID as CHK17_60_, userpo1_.LASTUPDATE as LASTUPDATE60_, userpo1_.TEMP1 as TEMP19_60_, userpo1_.TEMP2 as TEMP20_60_ from RUN08110.T_ACCUSR accountuse0_, RUN08110.T_USRINFO userpo1_, RUN08110.T_CUSTOMER customerpo2_ where userpo1_.CUST_ID=customerpo2_.ID and accountuse0_.USER_ID=userpo1_.ID and accountuse0_.CHK_FLAG>0 and userpo1_.IDENTITY>3 and (customerpo2_.CUST_CODE like '%0000000009%') and userpo1_.IDENTITY=7 and accountuse0_.REC_FLAG=1 [color=red]fetch first 10 rows only [/color]
就是这么一个由Hibernate转换出来的SQL语句 在IBM AS400数据库中执行就出现了问题,问题是由于有了fetch以后distinct失效了,本来这条语句的目的是先distinct取出不重复的记录,然后从不重复的记录中取出前面的10条记录,但是在AS400中执行以后结果却取出了重复的结果,其实就是distinct失效了。我认为这应该算这个数据库产品的一个BUG,后来我也解决了问题。解决问题的方法是改写了上面这条语句,先用户distinct取出了不重复的记录,语句变成这样的了:
select * from run08110.T_USRINFO where id in(select distinct userpo1_.ID as ID60 from RUN08110.T_ACCUSR accountuse0_, RUN08110.T_USRINFO userpo1_, RUN08110.T_CUSTOMER customerpo2_ where userpo1_.CUST_ID=customerpo2_.ID and accountuse0_.USER_ID=userpo1_.ID and accountuse0_.CHK_FLAG>0 and userpo1_.IDENTITY>3 and (customerpo2_.CUST_CODE like '%0000000009%') and userpo1_.IDENTITY=7 and accountuse0_.REC_FLAG=1) fetch first 10 rows only
也就是先用子查询找到不重复的记录,然后再从不重复的记录中取出10条,问题得到解决了,而且查询速度得到了大幅的提升。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 AS400 中读取中文数据需要进行以下几个步骤: 1. 确认 AS400 数据库支持中文字符集,通常情况下可以使用 UTF-8 字符集。 2. 设置 AS400 数据库连接的字符集为 UTF-8。可以通过在程序中设置连接参数或者在 JDBC URL 中添加字符集参数来完成。 3. 在程序中使用正确的字符集进行编码和解码。通常情况下,可以使用 Java 中的 UTF-8 编码格式来进行处理。 4. 在读取数据之前,需要先设置 AS400 环境变量,包括 LANG、LC_ALL 和 CCSID。 5. 在读取数据时,需要使用正确的字符集进行解码,以确保能够正确地显示中文字符。 下面是一个读取 AS400 中文数据的 Java 代码示例: ```java try { //连接数据库 Class.forName("com.ibm.as400.access.AS400JDBCDriver"); Connection conn = DriverManager.getConnection("jdbc:as400://[hostname];naming=system;errors=full;translate binary=true;charset=utf-8", "[username]", "[password]"); //设置环境变量 AS400 system = new AS400("[hostname]", "[username]", "[password]"); system.setJobCCSID(1200); system.setCcsid(1200); system.setJobMessageOption(AS400.MESSAGE_OPTION_NONE); system.setDateFormat(AS400.DATE_FORMAT_ISO); system.setTimeFormat(AS400.TIME_FORMAT_ISO); system.setDecimalSeparator('.'); system.setSortSequence(AS400.SORT_SEQUENCE_LANGUAGE); system.setThreadSafe(true); //执行 SQL 查询 PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM [tablename] WHERE [columnname] LIKE ?"); pstmt.setString(1, "%中文%"); ResultSet rs = pstmt.executeQuery(); //解码并输出结果 while (rs.next()) { String columnName = rs.getString("[columnname]"); String decodedColumnName = new String(columnName.getBytes("ISO-8859-1"), "UTF-8"); System.out.println(decodedColumnName); } //关闭连接 rs.close(); pstmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } ``` 请注意,上述示例仅供参考,具体实现可能因 AS400 版本和数据库配置而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值