我正在研究日历系统。我们正在使用德比。 我正在编写一个脚本来询问(在我看来)一个非常难的逻辑陈述。 我一直在阅读德比指令,但似乎无法找到一些指示。 当我制作逻辑时我使用了'Antijoin',看起来德比不支持这个。 对我的问题。在下图中。那个陈述是什么? 因为Derby不支持'Antijoin'因为我们已经做了很多其他查询,所以改变数据库表会很糟糕。对不起,它不是用英文写的,但标志是国际的。我也在比较脚本中的一些变量。逻辑工作就像它在那里我只是很难在Derby sql中编写它。
图中有关系。我没有必要使用反连接但是无法绕过另一种解决方法。
编辑:有一个问题是不使用图片,所以我会解释。 它现在是英文的,所以如果你在图片上看到不同的名字,我就会翻译它。
涉及两个表格。
间
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:只允许子查询返回单个列。
答案 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
现在要找到可用的房间,你可以反连接与从房间选择房间号。