我对使用数据库和 SQL 很陌生,我在找出一个函数时遇到了一些麻烦,该函数允许我根据数据库中其他表的数据显示 jdbc 数据库中表中的记录。我将在下面说明:
“需求”表示例(列标题,“ID”为主键):
NAME|ADDRESS|DESTINATION|DATE|TIME|ID
“驱动程序”表示例(“注册”是主键):
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";
它将显示“驱动程序”表的所有记录。
不过,我想要做的只是从驱动程序表中列出在需求中指定的时间可用的驱动程序(意味着他们的注册当前未与需求同时出现在旅程表中的记录中)如果可能,我也只想显示与整个记录相反的“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
);
以下查询可能会回答您的问题。
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 类型的字段,据您提供的内容可以判断。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句