我有这个任务,我需要为剧院建立预订系统。 我正在尝试构建一个查询,向我显示所有未被占用的座位。此刻我已经做到了:
select rownumber, seatnumber
from seats
where not exists
(
select seatnumber
from occupation
where shownumber = 1 and performancenumber = 1
)
order by rownumber, seatnumber
有人可以解释一下为什么它没有显示任何结果吗?当我只运行子查询时,它会向我显示所有占用的座位。
我试图查看其他论坛,但我没有找到任何答案。
谢谢
答案 0 :(得分: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;
答案 1 :(得分:0)
你可以尝试
select rownumber, seatnumber
from seats
where seatnumber not in
(
select seatnumber
from occupation
where shownumber = 1 and performancenumber = 1
)
order by rownumber, seatnumber
答案 2 :(得分: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;
我提到这个的原因是因为您可能会发现左外连接和不存在之间的性能差异。根据我的经验,在更新和删除时,EXESTS可能会有点慢...但是我再次听到其他人说完全相反。无论如何,戈登是对的。还有另外一种方法可以解决它,如果你想给它一个镜头。