我一般来说对数据库和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
);
答案 0 :(得分:0)
以下查询可能会回答您的问题。
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类型的字段,据您所提供的内容可以确定。