2013-05-20 25 views
1

选择我目前使用的是选择中的选择,以检查是否在表中存在的数据:内选择慢

select 
    a.id, 
    a.desc, 
    a.serial, 
    a.partno, 
    a.maintact, 
    a.lcnalc, 
    a.datedue, 
    a.intrem, 
    a.lifetype, 
    (select b.id from assets b where 
     (b.maintact = a.maintact) and 
     (b.aircraft_id = a.aircraft_id) and 
     (b.inittype = "STRT") and 
     (b.initlcnalc = a.lcnalc OR b.initlcnalc = "")) as parent 
    from assets a where aircraft_id = 6; 

我想知道的是一种更有效的方式做到上面的查询?

回答

2

尝试使用JOIN它会更快:

select 
    a.id, 
    a.desc, 
    a.serial, 
    a.partno, 
    a.maintact, 
    a.lcnalc, 
    a.datedue, 
    a.intrem, 
    a.lifetype, 
    b.id 
from assets a 
join assets b 
    ON (b.maintact = a.maintact) and 
    (b.aircraft_id = a.aircraft_id) and 
    (b.inittype = "STRT") and 
    (b.initlcnalc = a.lcnalc OR b.initlcnalc = "") 
where a.aircraft_id = 6; 
+1

顺便说一句,一旦添加了'(b.inittype =“STRT”)''常量条件,'LEFT JOIN'就会衰变成一个普通的'JOIN'。 – wildplasser

+0

@wildplasser是的你是对的,我错过了,thx – Stephan

0

你需要用left join要做到这一点,以确保你从assets所有行。下面是接近你想要什么:

select 
    a.id, 
    a.desc, 
    a.serial, 
    a.partno, 
    a.maintact, 
    a.lcnalc, 
    a.datedue, 
    a.intrem, 
    a.lifetype, 
    b.parent 
from assets a left outer join 
    (select maintact, aircraft_id, lcnalc, id 
     from assets a 
     group by maintact, aircraft_id, lcnal 
    ) b 
    on b.maintact = a.maintact) and 
     (b.aircraft_id = a.aircraft_id) and 
     (b.inittype = 'STRT') and 
     (b.initlcnalc = a.lcnalc) 
where a.aircraft_id = 6; 

需要说明的是表达b.initlcnalc = a.lcnalc OR b.initlcnalc = ""。我不确定这个应该做什么。它很可能会在您的输出中引入重复的行。您可能需要第二次加入来处理这种情况。