try {
Statement s = conn.createStatement();
ResultSet result2 = s.executeQuery("Select Distinct * From Poem p,Recording r Where r.PoemTitle = p.PoemTitle AND r.poemTitle = 'poem1'");
System.out.print("Result (Select with Join): ");
while (result2.next()) {
System.out.println(result2.getString(1)+ " " + result2.getString(2)+ result2.getString(3));
}
} catch(Exception e) {
System.out.print(e.getMessage());
}
我正在尝试输出诗歌及其录制日期。当它运行时它输出诗歌然后给出创建诗而不是录制的日期?这是因为这种关系吗?
答案 0 :(得分:2)
很可能是因为SELECT列表中的*
。
按照您希望返回的顺序指定要返回的列。
我们只是猜测包含"日期记录的列的名称"它列在哪个表格中:
SELECT p.PoemTitle
, r.dateRecorded
, r.readBy
FROM Poem p
JOIN Recording r
ON r.PoemTitle = p.PoemTitle
WHERE r.poemTitle = 'poem1'
GROUP
BY p.PoemTitle
, r.dateRecorded
, r.readBy
ORDER
BY p.PoemTitle
, r.dateRecorded DESC
, r.readBy
注意:
抛弃连接操作的旧式逗号语法,改为使用JOIN关键字,并将连接谓词从WHERE子句重定位到ON子句。
避免在SELECT列表中使用*
。显式列出要返回的列/表达式。当我们读取代码和SQL语句时,我们不知道返回了多少列,列的顺序是什么,或者数据类型是什么。 (我们必须查看表格定义。)
显式列出要返回的列/表达式只需要一些工作。如果只编写代码,那就没问题了,省时间写。但是代码的读取速度是写入的十倍。 (而*
的SQL语句使得getString(1)
引用哪一列的SQL语句几乎无法解读。
列出columns列也可以提高数据库的效率,使用几列和几十列的结果集来准备结果集,并且我们还将一个较小的结果集从数据库传输到客户端。使用列的子集,我们更有可能使用覆盖索引进行查询。