Вложенные запросы с использованием CSVJDBC
Я пытаюсь выполнить вложенный запрос с помощью 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 вложенные запросы, и если да, что не так с моим кодом?
Спасибо
2 ответа
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);
}
}
Проще говоря, нет, это не будет поддерживать.
CsvJdbc принимает только запросы SQL SELECT от single
таблица и не поддерживает операторы INSERT, UPDATE, DELETE или CREATE. Соединения между таблицами в запросах SQL SELECT не поддерживаются.
Ссылка на документацию для получения дополнительной информации