1

我有这个任务,我需要为剧院建立一个预订系统。我正在尝试构建一个查询,向我显示所有未占用的座位。此刻我做了这个:

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

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

我曾尝试查看其他论坛,但没有找到任何答案。

谢谢

4

3 回答 3

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;
于 2014-01-21T21:25:20.050 回答
0

你可以试试

select rownumber, seatnumber
from seats
where seatnumber not in
(
  select seatnumber
  from occupation
  where shownumber = 1 and performancenumber = 1
)
order by rownumber, seatnumber
于 2014-01-21T21:23:27.150 回答
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;

我之所以提到这一点是因为您可能会发现左外连接和不存在的地方之间存在性能差异。以我的经验 WHERE NOT EXISTS 更新和删除可能会有点慢......但我又一次听到其他人说完全相反。无论如何,戈登是对的。如果您也想尝试一下,还有另一种方法可以解决。

于 2014-01-21T21:50:51.350 回答