1

这里似乎有很多冗余。有没有更有效的方法,还是需要使用工会?还有第inner join一个是因为该players表没有酒店信息并且必须从中检索teams

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';
4

3 回答 3

3

是的,因为您从不同的表(球员、球迷、官员)中检索数据,所以工会在这里是必要的,我只能想象如果您提供一个从您指定为的表中提取所需信息的函数,您可以缩短此时间一个字符串,但这会导致使用连接或其他令人头疼的东西从字符串中构建查询,所以最好坚持使用联合选择;)

此外,如果这些表的其他列也没有区别,您可以考虑将它们全部放在一个表中,并通过标志或类似的东西来区分它们。

于 2013-05-06T10:19:56.863 回答
2

你有正确的方法去做。联合和内部连接是必要的。

于 2013-05-06T10:19:27.100 回答
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';

并向外移动条件,但它可能更慢但更简单

于 2013-05-06T10:27:18.050 回答