2014-01-21 73 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; 

我之所以提及這是因爲您可能會發現左外連接和不存在的位置之間的性能差異。根據我的經驗,不存在更新和刪除的速度可能會稍微慢一些...但是我再次聽到其他人說的完全相反。無論如何,戈登是對的。而且還有另外一種方法可以解決這個問題,如果你想要這樣做的話。