SQL问题'什么不存在'

时间:2015-05-27 13:41:03

标签: sql sql-server

我正在为小木屋建立一个预订系统,我正在尝试输入所有未在特定时段内预订的小屋。

预订表:

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个小屋,所有小屋都至少有一个预订。

我似乎只能在没有预订的几周内找到所有小屋,如果我搜索一周,例如预订了两个小木屋,结果就是没有小木屋。

3 个答案:

答案 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)