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;

我想知道的是执行上述查询的更有效方法?

4

2 回答 2

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;
于 2013-05-20T09:53:35.730 回答
0

您需要使用 a 执行此操作,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 = ""。我不确定这到底应该做什么。它可能会在您的输出中引入重复的行。您可能需要第二次加入来处理这种情况。

于 2013-05-20T11:35:53.040 回答