所以我已经将我的代码数据库从h2更改为postgresql,并且我注意到当我在postgresql中调用它时,h2中使用的Inner Join调用没有给出相同的结果。我已经完成了研究,经过测试,我发现左连接和其他连接工作完美,它只有内连接给我一个不同的结果。因此,要使两个输出csv文件匹配,我是否必须更改表的整个结构,或者在postgresql中有类似的东西我可以忽略?
public void doAllWork(int type, Connection conn, Statement st) {
try {
if (type == 1) {
st.execute("DROP TABLE IF EXISTS COMBINEDDATA;"); //USING DISTINCT TO EXCLUDE DUPLICATE RECORDS
st.execute("ANALYZE");
st.execute("CREATE TABLE COMBINEDDATA AS \n"
+ "SELECT DISTINCT E.DATA1, E.DATA2, E.DATA3, E.DATA4, E.DATA5, E.DATA6, \n"
+ "E.DATA7, E.DATA8, E.DATA9, E.DATA10, E.DATA11, E.DATA12, E.DATA13, E.DATA14, E.DATA15, E.DATA16, E.DATA17, \n"
+ "E.DATA18, E.DATA19, E.DATA21, E.DATA26, E.DATA27, E.DATA28, E.DATA29, \n"
+ "E.DATA30, E.DATA31, E.DATA32, E.DATA34, E.DATA35, E.DATA36, E.DATA37, E.DATA38, \n"
+ " C.CHAIN20, C.CHAIN33, C.CHAIN22, \n "
+ "D.DAT2, D.DAT3, D.DAT4, D.DAT7, D.DAT11, D.DAT9, D.DAT5, \n "
+ "E.DATA39, E.DATA40, E.DATA41 FROM rawData AS E \n"
+ "RIGHT JOIN CHAINDATA AS C \n"
+ "ON E.DATA7 = c.CHAIN2\n"
+ "AND E.DATA11 = c.CHAIN4\n"
+ "AND E.DATA21 = c.CHAIN10\n"
+ "AND E.DATA22 = c.CHAIN11\n"
+ "RIGHT JOIN DATDATA AS D\n"
+ "ON E.DATA7 = D.DAT18\n"
+ "AND E.DATA11 = D.DAT21\n"
+ "AND UCASE(E.DATA6) = UCASE(D.DAT17)\n"
+ "AND UCASE(E.DATA10) = UCASE(D.DAT20)\n"
+ "AND UCASE(E.DATA5) = UCASE(D.DAT16)\n"
+ "AND UCASE(E.DATA9) = UCASE(D.DAT19)\n"
+ "AND E.DATA20 = D.DAT22");
} else if (type == 2) {
st.execute("DROP TABLE IF EXISTS COMBINEDDATA2;");
st.execute("ANALYZE");
st.execute("CREATE TABLE COMBINEDDATA2 AS \n"
+ "SELECT DISTINCT E.DATA1, E.DATA2, E.DATA3, E.DATA4, E.DATA5, E.DATA6, \n"
+ "E.DATA7, E.DATA8, E.DATA9, E.DATA10, E.DATA11, E.DATA12, E.DATA13, E.DATA14, E.DATA15, E.DATA16, E.DATA17, \n"
+ "E.DATA18, E.DATA19, E.DATA21, E.DATA26, E.DATA27, E.DATA28, E.DATA29, \n"
+ "E.DATA30, E.DATA31, E.DATA32, E.DATA34, E.DATA35, E.DATA36, E.DATA37, E.DATA38, \n"
+ " C.CHAIN20, C.CHAIN33, C.CHAIN22, \n "
+ "D.DAT2, D.DAT3, D.DAT4, D.DAT7, D.DAT11, D.DAT9, D.DAT5, \n "
+ "E.DATA39, E.DATA40, E.DATA41 FROM rawData AS E \n"
+ "LEFT JOIN CHAINDATA AS C \n"
+ "ON E.DATA7 = c.CHAIN2\n"
+ "AND E.DATA11 = c.CHAIN4\n"
+ "AND E.DATA21 = c.CHAIN10\n"
+ "AND E.DATA22 = c.CHAIN11\n"
+ "LEFT JOIN DATDATA AS D\n"
+ "ON E.DATA7 = D.DAT18\n"
+ "AND E.DATA11 = D.DAT21\n"
+ "AND UCASE(E.DATA6) = UCASE(D.DAT17)\n"
+ "AND UCASE(E.DATA10) = UCASE(D.DAT20)\n"
+ "AND UCASE(E.DATA5) = UCASE(D.DAT16)\n"
+ "AND UCASE(E.DATA9) = UCASE(D.DAT19)\n"
+ "AND E.DATA20 = D.DAT22");
}
System.out.println("here");
if (type == 1) {
String dir = System.getProperty("user.dir");
st.executeUpdate("CALL CSVWRITE('" + dir + "\\OnlyMatching.csv', 'SELECT * FROM COMBINEDDATA','charset=UTF-8');"); //,
} else if (type == 2) {
String dir = System.getProperty("user.dir");
st.executeUpdate("CALL CSVWRITE('" + dir + "\\AllNonMatching.csv', 'SELECT * FROM COMBINEDDATA2','charset=UTF-8');");
}
} catch (Exception ex) {
Logger.getLogger(RyderCombinerGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
在上面的代码片段中,左连接的第二个循环在h2和postgresql上的工作方式相同,但内连接循环返回不同的内容。
提前致谢。
答案 0 :(得分:1)
假设您在H2和Postgres中使用相同的基础数据运行相同的ANSI兼容查询,您应该得到相同的结果。关于INNER JOIN
在任一数据库中的行为都没有什么不同。
但是在代码转储中快速搜索ORDER BY
表明您没有在查询中进行任何排序。我注意到Postgres似乎在data1
列上排序,而H2似乎根本没有排序。我建议结果集从未排序集的角度来看是相同的。
通常,如果您希望在结果集中进行cetain排序,则需要在生成该数据的查询中使用ORDER BY
。因此,如果您向两个查询添加ORDER BY data1
,我预计H2和Postgres的结果都会相同。