2013-05-06 86 views
1

這裏似乎有很多冗餘。有沒有更高效的方法,還是需要使用工會? inner join也在那裏,因爲players表沒有酒店信息,必須從teams中檢索。有沒有更有效的方法來編寫這個簡單的SQL查詢?

select players.name 
from players 
inner join teams 
on players.team = teams.name 
where teams.staysat = 'Ambassador' 
and teams.checkin is not null 
and teams.checkin < '18-AUG-07' 
and teams.checkout > '18-AUG-07' 
-- 
union all 
select officials.name 
from officials 
where officials.staysat = 'Ambassador' 
and officials.checkin is not null 
and officials.checkin < '18-AUG-07' 
and officials.checkout > '18-AUG-07' 
-- 
union all 
select fans.name 
from fans 
where fans.staysat = 'Ambassador' 
and fans.checkin is not null 
and fans.checkin < '18-AUG-07' 
and fans.checkout > '18-AUG-07'; 

回答

3

是的,因爲你檢索不同的表(球員,球迷,官員)工會需要在這裏,我只能想象,你可以縮短這個,如果你將提供拉從表中所需的信息的功能的數據,你會指定爲一個字符串,但這會導致建立查詢字符串串聯或其他headachy東西,所以也許更好地堅持與聯盟選擇;)

此外,如果表中沒有不同的其他列作爲那麼你可以考慮把它們全部放在一張桌子上,並用旗子或類似的東西來區分它們。

2

您有正確的方法來做到這一點。工會和內部聯合是必要的。

0

您可以使用子查詢或視圖(者優先),像這樣:

select * from (
select players.name as name, teams.checkin as checkin, teams.checkout as checkount, teams.staysat as staysat 
from players 
inner join teams 
on players.team = teams.name 

union all 
select officials.name as name, officials.checkin as checkin, officials.checkout as checkount, officials.staysat as staysat 
from officials 

union all 

select fans.name as name, fans.checkin as checkin, fans.checkout as checkount, fans.staysat as staysat 
from fans 

) as t 
where t.staysat = 'Ambassador' 
and t.checkin is not null 
and t.checkin < '18-AUG-07' 
and t.checkout > '18-AUG-07'; 

而向外移動的條件,但它可能會更慢,但更簡單的

相關問題