Java отображает записи из таблицы на основе записей в других таблицах - PullRequest
0 голосов
/ 20 ноября 2018

Я очень новичок в использовании баз данных и 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

Весь этот код работает нормально, и если я передам запрос в функцию «Получить», такие как:

String query = "select * from DRIVERS";

В нем будут отображены все записи таблицы "DRIVERS".

Что я хочу сделать, это только перечислить драйверы из таблицы драйверов, которые доступны в то время, которое указано в требовании (то есть их регистрация в настоящее время отсутствует в записи в таблице путешествий одновременно).по требованию) Если возможно, я бы также хотел отображать столбцы «ИМЯ» и «РЕГИСТРАЦИЯ», а не всю запись.

Я был бы очень признателен за помощь в этом, поскольку я довольно долго искал решения и не смог выработать функцию, которая обеспечит желаемый результат.

Приветствия,

Скрипт создания таблиц:

-- --------------------------------------------------------
--DROP Table Demands;
CREATE TABLE Demands (
  Name varchar(20),
  Address varchar(60),
  Destination varchar(60),
  Date date DEFAULT NULL,
  Time time DEFAULT NULL,
  Status varchar(15) NOT NULL,
  id INT primary key
);


-- --------------------------------------------------------
--DROP Table Drivers;
CREATE TABLE Drivers (
  username varchar(20),
  password varchar(20),
  Registration varchar(10),
  Name varchar(20),
  PRIMARY KEY (Registration)
);


-- --------------------------------------------------------

--DROP Table Journey;
CREATE TABLE Journey (
  jid INT primary key
  Destination varchar(60),
  Distance integer NOT NULL DEFAULT 1,
  Registration varchar(10) NOT NULL,
  Date date NOT NULL,
  Time time DEFAULT NULL
);

1 Ответ

0 голосов
/ 20 ноября 2018

Следующий запрос может ответить на ваш вопрос.

SELECT Drivers.Name, Drivers.Registration
FROM Drivers
LEFT JOIN Journey ON Journey.Registration = Drivers.Registration
LEFT JOIN Demands ON Demands.Date = Journey.Date
WHERE Demands.id IS NULL;

Это объединяет JOURNEY и DRIVER на основе отношения внешнего ключа.Затем он выполняет внешнее соединение DEMANDS и JOURNEY на основе неявного отношения, равного DATE.Наконец, мы храним только те записи, которые не соответствуют условию внешнего соединения.

Модель имеет существенный недостаток, хотя связь между DEMANDS и JOURNEY основана на поле типа Date, насколько можно судить по тому, чтопри условии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...