Sql 查询以检查座位是否已被占用

Sql 查询以检查座位是否已被占用,sql,subquery,not-exists,Sql,Subquery,Not Exists,我有一个任务,我需要为剧院建立一个预订系统。 我试图建立一个查询,显示所有未被占用的座位。此时此刻,我提出了以下观点: select rownumber, seatnumber from seats where not exists ( select seatnumber from occupation where shownumber = 1 and performancenumber = 1 ) order by rownumber, seatnumbe

我有一个任务,我需要为剧院建立一个预订系统。 我试图建立一个查询,显示所有未被占用的座位。此时此刻,我提出了以下观点:

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
where seatnumber not in
(
  select seatnumber
  from occupation
  where shownumber = 1 and performancenumber = 1
)
order by rownumber, seatnumber
这是您的查询:

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;

戈登的答案是正确的,当你加入座位号和排数。。。另一种方法是

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;

我之所以提到这一点,是因为您可能会发现左侧外部联接和不存在的位置之间的性能差异。根据我的经验,不存在的地方在更新和删除上可能有点慢。。。但我又听到其他人说了完全相反的话。不管怎样,戈登是对的。还有另一种方法,如果你也想试试的话

谢谢你的回复,问题是每行的座位号都是一样的。因此,如果我运行此查询,我还将过滤除已占用座位之外的其他座位。所以实际上我需要在2个柱上过滤。seatnumber和rownumbert这似乎有效,但问题是它也会将座位(具有相同的seatnumber)排除在未占用的行之外。@user3188517。我不知道这两个号码都是用来识别座位的。我觉得座位号就够了。