我正在为小木屋建立一个预订系统,我正在尝试输入所有未在特定时段内预订的小屋。
预订表:
CREATE TABLE Booking
(Customer_IdNr char(10),
CONSTRAINT test
FOREIGN KEY (Customer_IdNr)
REFERENCES Customer(IdNr)
ON DELETE CASCADE,
CabinNr integer,
BikeNr integer,
SkiNr integer,
TotalPrice integer,
StartWeek integer,
endWeek integer,)
在这里,我试图找到未预订的小屋:
SELECT Booking.CabinNr FROM Booking
WHERE NOT EXISTS
(SELECT * FROM Booking
WHERE
StartWeek >= '11'
AND endWeek <= '15'
)
我的桌子上有5个小屋,所有小屋都至少有一个预订。
我似乎只能在没有预订的几周内找到所有小屋,如果我搜索一周,例如预订了两个小木屋,结果就是没有小木屋。
答案 0 :(得分:3)
您需要一个相关的子查询。您的版本将返回所有cabins或none - 取决于子查询返回零行还是多行。
格式如下:
SELECT b.CabinNr
FROM Booking b
WHERE NOT EXISTS (SELECT 1
FROM Booking b2
WHERE b2.StartWeek >= 11 b2.endWeek <= 15 AND
b2.CabinNr = b.CabinNr
);
注意:不要对数字常量使用单引号。在某些情况下,这可能会使优化器(以及阅读查询的其他人)感到困惑。
答案 1 :(得分:0)
您的子查询与主查询无关。此外,您将StartWeek和endWeek的值包装在单引号中,但数据类型为int。这样的事情可能就是你想要的。
SELECT Booking.CabinNr
FROM Booking b
WHERE NOT EXISTS
(
SELECT *
FROM Booking b2
WHERE StartWeek >= 11
AND endWeek <= 15
AND b2.CabinNr = b.CabinNr
)
答案 2 :(得分:0)
将您的子查询加入主查询
SELECT a.CabinNr FROM Booking a
WHERE NOT EXISTS
(SELECT *
FROM Booking b
WHERE b.StartWeek >= '11'
AND b.endWeek <= '15'
AND b.CabinNr = a.CabinNr)