I have a query that contains amongst other things batsmanIDs and League names (extract below). I have put together another query to return all records where a batsman has played in each of two Leagues.
The query works but it is very, very slow.
There are 48,000 records returned in the first query but when I use that it runs instantly.
Can anyone suggest how to speed the new query up?
Thanks
Query:
x
SELECT *
FROM AddDateLeagueSeasontoScorecardBatting
WHERE League ="Indian Premier League" AND batsmanId IN (SELECT batsmanId FROM AddDateLeagueSeasontoScorecardBatting WHERE League ="Big Bash League") OR League ="Big Bash League" AND batsmanId IN (SELECT batsmanId FROM AddDateLeagueSeasontoScorecardBatting WHERE League ="Indian Premier League");
Advertisement
Answer
You could accomplish this using inner joins
such that the query will return only those records with a batmans appearing in both subqueries:
select t1.* from
(
AddDateLeagueSeasontoScorecardBatting t1 inner join
(
select distinct batsmanid
from AddDateLeagueSeasontoScorecardBatting
where League ="Indian Premier League"
) t2 on t1.batsmanid = t2.batsmanid
)
inner join
(
select distinct batsmanid
from AddDateLeagueSeasontoScorecardBatting
where League ="Big Bash League"
) t3 on t1.batsmanid = t3.batsmanid
EDIT: To select batsmen who have only played in the two leagues in question (and no others), you might try:
select t1.* from
AddDateLeagueSeasontoScorecardBatting t1 inner join
(
select batsmanid
from AddDateLeagueSeasontoScorecardBatting
group by batsmanid
having
sum(League not in ("Indian Premier League", "Big Bash League")) = 0 and
sum(League = "Indian Premier League") < 0 and
sum(League = "Big Bash League") < 0
) t2 on t1.batsmanid = t2.batsmanid