För det första behöver du inte distinct
. Frågan kan skrivas som:
select *
from [email protected]
where column1 in (
select column2
from [email protected]
where column3 > 0
)
order by column1
För det andra, det finns (minst) ytterligare två sätt att skriva det på. Antingen med JOIN
:
select t1.*
from [email protected] t1
join [email protected] t2
where t2.column2 = t1.column1
and t2.column3 > 0
group by
t1.id, t1.column1, ...
order by t1.column1
eller (min preferens) med EXISTS
:
select t1.*
from [email protected] t1
where exists
( select *
from [email protected]
where t2.column2 = t1.column1
and t2.column3 > 0
)
order by column1
I vilket fall som helst bör du kontrollera genomförandeplanerna för dem alla.
Jag förväntar mig att prestanda blir bäst om du har ett index på table1.column1
och för table2
, antingen ett index på column2
eller ett sammansatt index på (column3, column2)