【问题标题】:Java display records from a table based on records in other tablesJava 根据其他表中的记录显示表中的记录
【发布时间】:2019-04-23 02:18:45
【问题描述】:

一般来说,我对使用数据库和 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”表的所有记录。

我想要做的只是列出驱动程序表中在需求中指定的时间可用的驱动程序(这意味着他们的注册当前不在旅程表中的记录中与需求同时)如果可能的话,我也只想显示与整条记录相反的“NAME”和“REGISTRATION”列。

我非常感谢一些帮助,因为我已经搜索了很长一段时间的解决方案并且无法制定出能够达到预期结果的功能。

干杯,

创建表格脚本:

-- --------------------------------------------------------
--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
);

【问题讨论】:

标签: java mysql sql jdbc netbeans


【解决方案1】:

以下查询可能会回答您的问题。

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。然后它根据隐式关系 DATE 外连接 DEMANDS 和 JOURNEY。最后,我们只保留未通过外连接条件的记录。

该模型有一个重大缺陷,因为 DEMANDS 和 JOURNEY 之间的关系是基于 Date 类型的字段,就您提供的内容而言。

【讨论】:

  • 您好,感谢您的回复!您会建议我在 JOURNEY 中包含一个引用 DEMANDS 中 ID 的外键吗?那会是更好的解决方案吗?
  • 如果你有一对多的关系,是的(即每个旅程只有一个需求)。否则(旅程可能有一个或多个需求)您将不得不创建一个“打破”多对多关系的新表。
  • 我尝试按照您的说法传入查询,但是出现错误提示“java.lang.NullPointerException”
  • 您的NullPointerException 可能是由于您的表中存在空值,例如。驱动程序中的名称。
  • 请忽略我之前的cmets,我错误地实现了你的查询,我现在已经正确地实现了它并且它工作得很好!我非常感谢您的帮助,因为我对所有这些 SQL 和关系数据库业务都是全新的,您向我展示的内容帮助我更好地掌握了一些概念
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多