Вложенные запросы с использованием CSVJDBC

1

Я пытаюсь выполнить вложенный запрос, используя csvJDBC.

Соответствующие таблицы имеют следующие атрибуты:

comp(comp_id, comp_description)
work_opportunities(wo_id, jp_id)
link_wo_comp (wo_id, comp_id)

Запрос:

SELECT comp_id, count(comp_id)
FROM link_wo_comp
WHERE wo_id IN (SELECT distinct wo_id FROM work_opportunities WHERE jp_id = '1')
GROUP BY comp_id;

Я выполнил подзапрос и основной запрос самостоятельно, и они сработали.

Это код, который я использую:

try {
            Class.forName("org.relique.jdbc.csv.CsvDriver");

            Connection conn = DriverManager.getConnection("jdbc:relique:csv:"
                    + "D:/Desktop/Data/Cleansed/");

            Statement stmt = conn.createStatement();

            String sql = "SELECT comp_id, count(comp_id) "
                    + "FROM link_wo_comp "
                    + "WHERE wo_id IN (SELECT distinct wo_id FROM work_opportunities WHERE jp_id = '1') "
                    + "GROUP BY comp_id;";

            ResultSet results = stmt.executeQuery(sql);

            boolean append = true;
            CsvDriver.writeToCsv(results, System.out, append);

            // Clean up
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

Журнал ошибок:

java.sql.SQLException: Syntax error: Encountered "" at line 1, column 66.
Was expecting one of:

    at org.relique.jdbc.csv.CsvStatement.executeQuery(Unknown Source)
    at testing.TestRun.main(TestRun.java:30)

Поддерживает ли csvJDBC вложенные запросы, и если да, то что не так с моим кодом?

благодаря

Теги:
jdbc
csvjdbc

2 ответа

0
Лучший ответ

CSVJDBC не может обрабатывать вложенные запросы или инструкции SELECT из более чем одного CSV файла за раз, но HSQLDB поддерживает CSV файлы в виде текстовых таблиц, поэтому вы можете использовать такой код:

public static void main(String[] args) {
    // create HSQLDB :file: database in the same folder as the CSV files
    String connectionUrl = "jdbc:hsqldb:file:C:/__tmp/hsqldbCSV/Cleansed/hsqldb";
    try (Connection conn = DriverManager.getConnection(connectionUrl, "SA", "")) {
        try (Statement s = conn.createStatement()) {
            s.execute("DROP TABLE IF EXISTS comp");
            s.execute("CREATE TEXT TABLE comp (comp_id int, comp_description varchar(50))");
            s.execute("SET TABLE comp SOURCE 'comp.csv'");
            s.execute("DROP TABLE IF EXISTS work_opportunities");
            s.execute("CREATE TEXT TABLE work_opportunities (wo_id int, jp_id int)");
            s.execute("SET TABLE work_opportunities SOURCE 'work_opportunities.csv'");
            s.execute("DROP TABLE IF EXISTS link_wo_comp");
            s.execute("CREATE TEXT TABLE link_wo_comp (wo_id int, comp_id int)");
            s.execute("SET TABLE link_wo_comp SOURCE 'link_wo_comp.csv'");
            String sql = "SELECT comp_id, count(comp_id) "
                    + "FROM link_wo_comp "
                    + "WHERE wo_id IN (SELECT distinct wo_id FROM work_opportunities WHERE jp_id = '1') "
                    + "GROUP BY comp_id;";
            try (ResultSet rs = s.executeQuery(sql)) {
                while (rs.next()) {
                    System.out.println(String.format("comp_id: %d, count: %d", rs.getInt(1), rs.getInt(2)));
                }
            }
            s.execute("SHUTDOWN");
        }
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
}
1

Проще говоря, это не будет поддерживать.

CsvJdbc принимает только SQL SELECT-запросы из single таблицы и не поддерживает инструкции INSERT, UPDATE, DELETE или CREATE. Соединения между таблицами в запросах SQL SELECT не поддерживаются.

Обратитесь к ссылке doc для получения дополнительной информации.

http://csvjdbc.sourceforge.net/doc.html

  • 0
    Ба отстой. Спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню