Arraylist содержит и сохраняет все, что не дает того же результата, что и внутреннее соединение Sql

#java #arrays #arraylist

#java #массивы #arraylist

Вопрос:

Вывод Sql: 312 внутреннее соединение Sql-скрипта:

 SELECT count(*) FROM COST_TYPE_SELECTION CST
LEFT JOIN GBL_HYPACCT_RSLV_TBL_NEW_CA GBL
ON GBL.TREE_NODE = CST.GL_TREE_NODE
AND GBL.TREE_LEVEL = CST.GL_TREE_LEVEL
LEFT JOIN DIM_HYP_PCCODE_FLATTEN DIM
ON CST.PC_TREE_LEVEL = DIM.TREE_LEVEL
AND CST.PC_TREE_NODE = DIM.TREE_LEVEL_NODE
AND DIM.LEGAL_ENTITY='007'
AND DIM.PC_CODE='0200'
and CST.COST_TYPE='Direct_Expenses'
INNER JOIN EPM_CONSOLIDATED_LEDGER_M EPM
ON EPM.LEGAL_ENTITY = DIM.LEGAL_ENTITY
AND EPM.gl_profit_centre_cd = DIM.PC_CODE
AND EPM.GL_ACCOUNT_NUMBER = GBL.TREE_LEAF
WHERE  EPM.sourcedataloccd='SG'
  

Сценарий Jdbc 1: сохранение GLaccount в arraylist Gllishive

 SELECT GBL.TREE_LEAF FROM COST_TYPE_SELECTION CST
LEFT JOIN GBL_HYPACCT_RSLV_TBL_NEW_CA GBL
ON GBL.TREE_NODE = CST.GL_TREE_NODE
AND GBL.TREE_LEVEL = CST.GL_TREE_LEVEL
LEFT JOIN DIM_HYP_PCCODE_FLATTEN DIM
ON CST.PC_TREE_LEVEL = DIM.TREE_LEVEL
AND CST.PC_TREE_NODE = DIM.TREE_LEVEL_NODE
AND DIM.LEGAL_ENTITY='007'
AND DIM.PC_CODE='0200'
  

Сценарий Jdbc 2: сохранение GLaccount в arraylist GllistMaria

 select gl_account from EPM_CONSOLIDATED_LEDGER_M EPM
ON EPM.LEGAL_ENTITY ='007' AND EPM.gl_profit_centre_cd = '7482'
WHERE  EPM.sourcedataloccd='SG'
  

Затем сравнивая приведенный ниже код

 System.out.println("size of hive: "   Gllishive.size());
System.out.println("size of maria join: "   GllistMaria.size());
List<String> joins = new ArrayList<String>(GllistMaria);
joins.retainAll(Gllishive);
System.out.println("after retailall: "   joins.size());

ArrayList<String> MatchingGL = new ArrayList<String>();
for(int i=0;i<GllistMaria.size();i  ){
if(Gllishive.contains(GllistMaria.get(i))){
MatchingGL.add(GllistMaria.get(i));
}
}       
System.out.println("after contains using for loop :" MatchingGL);
  

Вывод, который я получаю: 873 как в методе retain all, так и в contains, не соответствовал выводу sql: 312

Завершите приведенный ниже код

 public void Script1(String ss)   {
    try{
      String consolm = "SELECT * FROM COST_TYPE_SELECTION CSTn"  
    "LEFT JOIN GBL_HYPACCT_RSLV_TBL_NEW_CA GBL ON GBL.TREE_NODE = CST.GL_TREE_NODE AND GBL.TREE_LEVEL = CST.GL_TREE_LEVELn"  
    "LEFT JOIN DIM_HYP_PCCODE_FLATTEN DIM ON CST.PC_TREE_LEVEL = DIM.TREE_LEVEL AND CST.PC_TREE_NODE = DIM.TREE_LEVEL_NODEn"  
    "AND DIM.LEGAL_ENTITY='007'n"  
    "AND DIM.PC_CODE=?"  
    "and CST.COST_TYPE='Direct_Expenses'n";


        PreparedStatement sta2 = con.prepareStatement(consolm);
        sta2.setString(1, ss);
        ResultSet result3 = sta2.executeQuery();

        HashMap<String, List<String>> map = new HashMap<>();
        HashMap<String, List<String>> map5 = new HashMap<>();
        HashMap<String, List<String>> map6 = new HashMap<>();
        List<String> glAcs = new ArrayList<>();
        List<String> glAcs2 = new ArrayList<>();
        List<String> glAcs3 = new ArrayList<>();
        List<String> glAcs4 = new ArrayList<>();

        while(result3.next()){
            String de = result3.getString("gbl.descr");
            if(map.get(de)!=null){
              glAcs = map.get(de);
              glAcs.add(result3.getString("gbl.tree_leaf"));
              map.put(de,glAcs);
                data.add(result3.getString("gbl.tree_leaf"));
            }else{
                List<String> glAcs1 = new ArrayList<>();
                glAcs1.add(result3.getString("gbl.tree_leaf"));
                map.put(de,glAcs1);
                data.add(result3.getString("gbl.tree_leaf"));
            }


            String pe = result3.getString("gbl.descr");
            if(map5.get(pe)!=null){
                glAcs3 = map5.get(pe);
                glAcs3.add(result3.getString("cst.legal_entity"));
                map5.put(pe,glAcs3);
                data22.add(result3.getString("cst.legal_entity"));
            }
            else{ List<String> glAcs13 = new ArrayList<>();
                glAcs13.add(result3.getString("cst.legal_entity"));
                map5.put(pe,glAcs13);
                data22.add(result3.getString("cst.legal_entity"));
            }

            String he = result3.getString("gbl.descr");
            if(map6.get(he)!=null){
                glAcs4 = map6.get(he);
                glAcs4.add(result3.getString("dim.pc_code"));
                map6.put(he,glAcs4);
                data33.add(result3.getString("dim.pc_code"));
            }
            else{
                List<String> glAcs14 = new ArrayList<>();
                glAcs14.add(result3.getString("dim.pc_code"));
                map6.put(he,glAcs14);
                data33.add(result3.getString("dim.pc_code"));
            }
        }

        Set<String> hs = map.keySet();
        Iterator itr = hs.iterator();

        while(itr.hasNext()){
            String key = itr.next().toString();
           Glac.addAll(map.get(key));
                          }
        System.out.println(" Final count of hive was :" Glac.size());
        System.out.println(" Final count of hive was :" data.size());

        Set<String> hs22 = map5.keySet();
        Iterator itr22 = hs22.iterator();

        while(itr22.hasNext()){
            String key = itr22.next().toString();
            legen.addAll(map5.get(key));
        }
        System.out.println(" Final count of hive was :" legen.size());
        System.out.println(" Final count of hive was :" data22.size());

        Set<String> hs33 = map6.keySet();
        Iterator itr33 = hs33.iterator();

        while(itr33.hasNext()){
            String key = itr33.next().toString();
            pc.addAll(map6.get(key));
        }
        System.out.println(" Final count of hive was :" pc.size());
        System.out.println(" Final count of hive was :" data33.size());


        con.close();

    }catch(ClassNotFoundException |IOException e){

    }catch (SQLException e){
        e.printStackTrace();
    }catch(Exception e){
        e.printStackTrace();
        System.out.println(e.toString());
    }

}

public void script2(String ss)   {
    try{

        String consolm = "select * from EPM_CONSOLIDATED_LEDGER_M EPMn"  
                "WHERE  EPM.sourcedataloccd='SG'AND EPM.primarysourcesyscd NOT IN('EPMCA','EPMTX','EPMOS')n"  
                "AND EPM.businessdt='20181130' AND EPM.rundt='20181204' AND EPM.GL_BU_CD IN ('DBU','ACU')n"  
                "AND EPM.LEGAL_ENTITY = '007'n"  
                "AND EPM.gl_profit_centre_cd = ?";


        PreparedStatement sta2 = con.prepareStatement(consolm);
        sta2.setString(1, ss);
        ResultSet result3 = sta2.executeQuery();

        HashMap<String, List<String>> map = new HashMap<>();
        HashMap<String, List<String>> map3 = new HashMap<>();
        HashMap<String, List<String>> map4 = new HashMap<>();
        List<String> glAcs2 = new ArrayList<>();
        List<String> glAcs3 = new ArrayList<>();
        List<String> glAcs4 = new ArrayList<>();
                    while(result3.next())
                    {
            String de = result3.getString("epm.product_cd_hyperion");
            if(map.get(de)!=null){
                glAcs2 = map.get(de);
                glAcs2.add(result3.getString("epm.gl_account_number"));
                map.put(de,glAcs2);
                data2.add(result3.getString("epm.gl_account_number"));
            }else{
                List<String> glAcs12 = new ArrayList<>();
                glAcs12.add(result3.getString("epm.gl_account_number"));
                map.put(de,glAcs12);
                data2.add(result3.getString("epm.gl_account_number"));
            }


            String pe = result3.getString("epm.product_cd_hyperion");
                    if(map3.get(pe)!=null){
            glAcs3 = map3.get(pe);
            glAcs3.add(result3.getString("epm.legal_entity"));
            map3.put(pe,glAcs3);
            data3.add(result3.getString("epm.legal_entity"));
            }
            else{ List<String> glAcs13 = new ArrayList<>();
                glAcs13.add(result3.getString("epm.legal_entity"));
                map3.put(pe,glAcs13);
                data3.add(result3.getString("epm.legal_entity"));
            }

            String he = result3.getString("epm.product_cd_hyperion");
                        if(map4.get(he)!=null){
                            glAcs4 = map4.get(he);
                            glAcs4.add(result3.getString("epm.gl_profit_centre_cd"));
                            map4.put(he,glAcs4);
                            data4.add(result3.getString("epm.gl_profit_centre_cd"));
                        }
                        else{
                            List<String> glAcs14 = new ArrayList<>();
                            glAcs14.add(result3.getString("epm.gl_profit_centre_cd"));
                            map4.put(he,glAcs14);
                            data4.add(result3.getString("epm.gl_profit_centre_cd"));
                        }


        }

        Set<String> hs = map.keySet();
        Iterator itr = hs.iterator();

        while(itr.hasNext()){
            String key = itr.next().toString();

            Glac2.addAll(map.get(key));

        }
        System.out.println(" Final count of hive2 was :" Glac2.size());
        System.out.println(" Final count of hive2 was :" data2.size());

        Set<String> hs2 = map3.keySet();
        Iterator itr2 = hs2.iterator();

        while(itr2.hasNext()){
            String key = itr2.next().toString();

            legen2.addAll(map3.get(key));

        }
        System.out.println(" Final count of hive3 was :" legen2.size());
        System.out.println(" Final count of hive3 was :" data3.size());

        Set<String> hs3 = map4.keySet();
        Iterator itr3 = hs3.iterator();
        while(itr3.hasNext()){
            String key = itr3.next().toString();

            pc2.addAll(map4.get(key));

        }
        System.out.println(" Final count of hive4 was :" pc2.size());
        System.out.println(" Final count of hive4 was :" data4.size());

        con.close();

    }catch(ClassNotFoundException |IOException e){

    }catch (SQLException e){
        e.printStackTrace();
    }catch(Exception e){
        e.printStackTrace();
        System.out.println(e.toString());
    }

}

@Test
 public void Innerjoin() throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {

    Script1("0200");
    script2("0200");
    ArrayList<String> MatchingGL = new ArrayList<String>();
    for (int i = 0; i < Glac2.size(); i  ) {

        if (Glac.contains(Glac2.get(i))) {
            MatchingGL.add(Glac2.get(i));
        }
    }
    System.out.println("after contains using for loop :"   MatchingGL.size());

    ArrayList<String> MatchingGL2 = new ArrayList<String>();
    for (int i = 0; i < Glac2.size(); i  ) {

        if (legen.contains(legen2.get(i))amp;amp;pc.contains(pc2.get(i))
                amp;amp;Glac.contains(Glac2.get(i))) {
            MatchingGL2.add(Glac2.get(i));
        }
    }
    System.out.println("after contains using for loop :"   MatchingGL2.size());

}
  

Комментарии:

1. Подумайте о том, чтобы сделать отступы в коде удобочитаемыми, прежде чем просить людей прочитать его.

2. Уже применен отступ

3. Это ошибка копирования-вставки, игнорируйте ее, мой вопрос заключался в том, какое изменение мне нужно, чтобы получить результат внутреннего соединения в java

4. Похоже, у вас больше ошибок копирования-вставки, поэтому понять запросы непросто. В первом запросе у вас есть дополнительная строка в предложении ON для внутреннего соединения, GL_ACCOUNT_NUMBER = GBL.TREE_LEAF которую я не могу найти в двух других соединениях. Это тоже ошибка или она должна быть там, потому что это делает соединение совершенно другим, поскольку другие условия в предложении ON относятся к таблице DIM, но это для таблицы GBL?

5. EPM.GL_ACCOUNT_NUMBER = GBL.TREE_LEAF Это условие мы пытаемся использовать Java arraylist и ожидаем, что 1-й вывод Sql равен 312, но Java-код выдает нам 873. Помогите нам с настройкой Java-кода для получения вывода inner join как 1st sql

Ответ №1:

Давайте предположим, что для 1-го запроса, который COST_TYPE_SELECTION содержит 10 допустимых строк и что LEFT JOIN with DIM_HYP_PCCODE_FLATTEN возвращает 5 строк из DIM.

Это означает, что внутреннее соединение с EPM_CONSOLIDATED_LEDGER_M будет выполнено для 5 строк, поэтому, даже если все строки совпадают в этом соединении, общее количество строк для запроса будет равно 5.

С теми же данными первый запрос jdbc вернет все 10 строк, поскольку внутреннего соединения нет, невозможно определить, сколько строк вернет второй запрос jdbc, но из ваших результатов можно с уверенностью сказать, что это будет намного больше, чем 5 строк.

Итак, чтобы решить эту проблему в java, вам нужно включить все столбцы, используемые во внутреннем соединении, а затем выполнить то же сопоставление, что и во внутреннем соединении, между списками для всех этих столбцов.

Комментарии:

1. Вставил полный код выше, попробовал то, что вы сказали, как будто включил все остальные столбцы также в сравнение, теперь я получил 114 в качестве вывода, но ожидал, что внутреннее соединение равно 312

2. @manoj Я думаю, что только вы можете разобраться в этом, потому что только у вас есть доступ к базе данных и данным для тестирования.