Derby数据库查询

时间:2011-03-31 14:31:19

标签: derby

我正在研究日历系统。我们正在使用德比。 我正在编写一个脚本来询问(在我看来)一个非常难的逻辑陈述。 我一直在阅读德比指令,但似乎无法找到一些指示。 当我制作逻辑时我使用了'Antijoin',看起来德比不支持这个。 对我的问题。在下图中。那个陈述是什么? 因为Derby不支持'Antijoin'因为我们已经做了很多其他查询,所以改变数据库表会很糟糕。对不起,它不是用英文写的,但标志是国际的。我也在比较脚本中的一些变量。逻辑工作就像它在那里我只是很难在Derby sql中编写它。

图中有关系。我没有必要使用反连接但是无法绕过另一种解决方法。

enter image description here

编辑:有一个问题是不使用图片,所以我会解释。 它现在是英文的,所以如果你在图片上看到不同的名字,我就会翻译它。

涉及两个表格。

ROOMNAME numberOfPeople 描述

会议

(这里有更多,但我只会写重要内容) ROOMNAME meetingStart meetingEnd

查询是找到可用于会议的女巫房间。

我设计的是,我将从会议桌中仅选择与您尝试制作的房间的新预订相冲突的会议。在我看来,你不能反过来做。它看起来像这样: reservationStart> meetingStart AND meetingEnd> reservationEnd

然后我将'反连接'所有房间的列表。这将列出所有可用的房间。问题是,德比看起来似乎无法反抗。是否有另一种方法来构建与其他连接的反连接?希望你明白我在写什么

EDIT2:

我没有收到任何错误,因为我没有尝试任何查询。我一直在努力进行查询,到目前为止我得到的是:

SELECT roomName, numberOfPeople, description FROM ROOM WHERE roomName NOT IN (SELECT roomName, meetingStart, meetingEnd FROM Meeting WHERE reservationEnd > meetingStart AND meetingEnd > reservationStart);

但是从我读过的内容来看,德比没有'不在'。我该如何改写查询?

编辑3:

我有查询。我现在得到的错误代码是:

ERROR 42X39:只允许子查询返回单个列。

3 个答案:

答案 0 :(得分:1)

你得到'ERROR 42X39:只允许子查询返回一列。',因为你的子查询

SELECT roomName, meetingStart, meetingEnd FROM Meeting WHERE reservationEnd > meetingStart AND meetingEnd > reservationStart

返回3列(roomName,meetingStart,meetingEnd)。

为了使NOT IN只能使用1列。子查询将创建一组值,为此,只能将一列中的值写入该组。

您需要将子查询更改为:

SELECT roomName FROM Meeting WHERE reservationEnd > meetingStart AND meetingEnd > reservationStart

答案 1 :(得分:0)

NOT IN在Derby中工作正常。您可以在以下文档中找到它:http://db.apache.org/derby/docs/10.7/ref/rrefsqlj23075.html#rrefsqlj23075

您发出的实际查询是什么,以及您收到的实际错误?

答案 2 :(得分:0)

找到忙于会议的房间,
从会议ms中选择roomNames,保留rs,其中rs.reservationEnd> ms.meetingStart AND ms.meetingEnd> rs.reservationStart
现在要找到可用的房间,你可以反连接从房间选择房间号