У меня возникли проблемы с выяснением того, как изменить существующий запрос sql, чтобы он позволял мне отображать записи из таблицы в моей базе данных jdbc на основе данных из других таблиц в базе данных.Ниже я проиллюстрирую свою проблему:
Пример таблицы «DEMANDS» (заголовки столбцов, «ID» - первичный ключ):
NAME|ADDRESS|DESTINATION|DATE|TIME|ID
Пример таблицы «DRIVERS» («REGISTRATION»"является первичным ключом):
USERNAME|PASSWORD|REGISTRATION|NAME
Пример таблицы" JOURNEY "(" JID "является первичным ключом," REGISTRATION "является внешним ключом)
JID|NAME|ADDRESS|DESTINATION|DISTANCE|REGISTRATION|DATE|TIME|STATUS
Ниже приведен код, который используется для отображения таблиц в файле jsp:
public String retrieve(String query) throws SQLException {
select(query);
return makeTable(rsToList());//results;
}
private void select(String query){
try {
statement = connection.createStatement();
rs = statement.executeQuery(query);
//statement.close();
}
catch(SQLException e) {
System.out.println("way way"+e);
//results = e.toString();
}
}
private String makeTable(ArrayList list) {
StringBuilder b = new StringBuilder();
String[] row;
b.append("<table border=\"3\">");
for (Object s : list) {
b.append("<tr>");
row = (String[]) s;
for (String row1 : row) {
b.append("<td>");
b.append(row1);
b.append("</td>");
}
b.append("</tr>\n");
} // for
b.append("</table>");
return b.toString();
}//makeHtmlTable
private ArrayList rsToList() throws SQLException {
ArrayList aList = new ArrayList();
ResultSetMetaData metaData = rs.getMetaData();
int count = metaData.getColumnCount(); //number of column
String columnName[] = new String[count];
for (int i = 1; i <= count; i++)
{
columnName[i-1] = metaData.getColumnLabel(i);
}
aList.add(columnName);
int cols = rs.getMetaData().getColumnCount();
while (rs.next()) {
String[] s = new String[cols];
for (int i = 1; i <= cols; i++) {
s[i-1] = rs.getString(i);
}
aList.add(s);
} // while
return aList;
} //rsToList
У меня есть следующий запрос:
SELECT Drivers.Name, Drivers.Registration
FROM Drivers
LEFT JOIN Journey ON Journey.Registration = Drivers.Registration
LEFT JOIN Demands ON Demands.Time = Journey.Time
WHERE Demands.id IS NULL
Этот запрос выполняет список драйверовиз таблицы драйверов, которые доступны в момент, указанный в требовании (то есть их регистрация в настоящее время отсутствует в записи в таблице поездок одновременно с запросом).
Кажется, я не могу понять, какЯ также могу изменить запрос, чтобы принять во внимание даты, чтобы драйверы, которые будут отображаться, были теми, которые доступны в то время и в дату, которые указаны в требовании, а не только во времени (то есть их регистрация в настоящее время не выполняется.запись втаблица поездок в то же время и в день, что и запрос).
Например, в настоящее время, если у водителя в таблице поездок есть бронь на 9:30 2018-11-22, они не будут отображатьсядля запроса с датой 2018-11-25 в 9:30 из-за того, что у водителя уже есть заказ в 9:30, даже если они в разные даты.
Я пробовал:
SELECT Drivers.Name, Drivers.Registration
FROM Drivers
LEFT JOIN Journey ON Journey.Registration = Drivers.Registration
LEFT JOIN Demands ON Demands.Date = Journey.Date
LEFT JOIN Demands ON Demands.Time = Journey.Time
WHERE Demands.id IS NULL
Однако, это дает мне ошибку исключения нулевого указателя, любая помощь по этому вопросу будет принята с благодарностью!
Приветствия,