Java根据其他表中的记录显示表中的纪录



我对一般使用数据库和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

所有这些代码都运行良好,如果我将查询传递到"Retrieve"函数中,例如:

String query = "select * from DRIVERS";

它将显示"DRIVERS"表中的所有记录。

不过,我想做的是,只列出在需求中指定的时间可用的驾驶员表中的驾驶员(这意味着他们的注册目前不在行程表中的记录中(。如果可能的话,我也只想显示"姓名"one_answers"注册"列,而不是整个记录。

我真的很感激能在这方面得到一些帮助,因为我已经四处寻找解决方案很长一段时间了,但还没能找到一个能达到预期结果的函数。

干杯,

创建表格脚本:

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

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

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类型的字段,根据您提供的内容可以判断。

最新更新