2014-01-21 52 views
1

我有这项任务,需要为剧院建立预订系统。 我想建立一个查询,显示我没有占用的所有席位。在这一刻,我做了这个:查询以检查座位是否已被占用

select rownumber, seatnumber 
from seats 
where not exists 
(
     select seatnumber 
     from occupation 
     where shownumber = 1 and performancenumber = 1 
) 
order by rownumber, seatnumber 

有人可以解释我为什么它不显示任何结果?当我只运行子查询时,它显示了我占用的所有座位。

我试图在其他论坛看,但我没有找到任何答案。

谢谢

回答

0

你可以尝试

select rownumber, seatnumber 
from seats 
where seatnumber not in 
(
    select seatnumber 
    from occupation 
    where shownumber = 1 and performancenumber = 1 
) 
order by rownumber, seatnumber 
+0

感谢您的回复,问题在于每一行都有相同的座位号。所以,如果我运行这个查询,我也会过滤比占用的其他席位。所以我真的需要在2个柱子上过滤它。 seatnumber和rownumber – user3188517

1

这是您的查询:

select rownumber, seatnumber 
from seats 
where not exists (select seatnumber 
        from occupation 
        where shownumber = 1 and performancenumber = 1 
       ) 
order by rownumber, seatnumber; 

这不返回任何行,因为子查询总是返回一些行 - 如果至少一个座位被占用。

你想要一个相关子查询:

select rownumber, seatnumber 
from seats s 
where not exists (select o.seatnumber 
        from occupation o 
        where shownumber = 1 and performancenumber = 1 and 
         o.seatnumber = s.seatnumber and o.rownumber = s.seatnumber 
       ) 
order by rownumber, seatnumber; 
+0

这似乎工作,但问题是它也会排除未占用行的座位(具有相同的座位号)。 – user3188517

+0

@ user3188517。 。 。我不知道这两个数字都需要识别一个座位。我以为'seatnumber'就够了。 –

0

戈登的答案是正确的,当你的座位号和行号加入...另一种方式,你可以做到这一点是

select s.rownumber, s.seatnumber 
from seats s 
left outer join occupation o 
on (o.seatnumber = s.seatnumber 
and o.rownumber = s.rownumber) 
where (s.shownumber = 1 and s.performancenumber = 1 and s.rownumber is null) 
order by rownumber, seatnumber; 

我之所以提及这是因为您可能会发现左外连接和不存在的位置之间的性能差异。根据我的经验,不存在更新和删除的速度可能会稍微慢一些...但是我再次听到其他人说的完全相反。无论如何,戈登是对的。而且还有另外一种方法可以解决这个问题,如果你想要这样做的话。