繁体   English   中英

有没有更有效的方法来编写此简单的SQL查询?

[英]Is there a more efficient way to write this simple SQL query?

这里似乎有很多冗余。 有没有更有效的方法,还是需要使用工会? 还有第一个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';

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

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

您有正确的方法来做。 联合和内部联接是必需的。

您可以使用子查询或视图(首选),如下所示:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM