INNER JOIN与h2数据库和postgresql数据库的差异

时间:2017-10-13 02:13:06

标签: database postgresql csv join h2

所以我已经将我的代码数据库从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上的工作方式相同,但内连接循环返回不同的内容。

例)
这是使用h2数据库的输出csv文件。

这是使用postgresql数据库的输出 And this is the output using postgresql database

提前致谢。

1 个答案:

答案 0 :(得分:1)

假设您在H2和Postgres中使用相同的基础数据运行相同的ANSI兼容查询,您应该得到相同的结果。关于INNER JOIN在任一数据库中的行为都没有什么不同。

但是在代码转储中快速搜索ORDER BY表明您没有在查询中进行任何排序。我注意到Postgres似乎在data1列上排序,而H2似乎根本没有排序。我建议结果集从未排序集的角度来看是相同的。

通常,如果您希望在结果集中进行cetain排序,则需要在生成该数据的查询中使用ORDER BY。因此,如果您向两个查询添加ORDER BY data1,我预计H2和Postgres的结果都会相同。

相关问题