2016-11-01 2 views
0

Ich habe folgende PL/SQL-Abfrage:Last-ID mit subquery

select praca.nmpraca, pista.idpista, sentidoPista.NMSENTIDOPISTA, pista.idslt, statusSltPista.STATUS, statusSltPista.DHMMENSAGEM, 
     statusSltProxy.DHMMENSAGEM, statusSltProxy.STATUS, statusAntena.DHMMENSAGEM, statusAntena.STATUS, statusMcr.DHMMENSAGEM, statusMcr.STATUS, 
     chavesMcr.DHM_RECEBIDO, chavesMcr.QNT_CHAVES, statusPista.DHMMENSAGEM, statusPista.STATUS 
FROM MCR_TBPRACA praca 
inner 
join MCR_TBINATIVACAOPISTA pista 
on praca.IDTBPRACA = pista.IDPRACA 
inner 
join MCR_TBSENTIDOPISTA sentidoPista 
ON sentidoPista.IDSENTIDOPISTA = pista.IDSENTIDOPISTA 
left 
join MCR_TBSTATUSGEACOMSLT statusSltPista 
on statusSltPista.IDPRACA = praca.IDPRACA 
and pista.IDPISTA = statusSltPista.PISTA 
and statusSltPista.IDSTATUSGEACOMSLT = (select max(s.IDSTATUSGEACOMSLT)  from MCR_TBSTATUSGEACOMSLT s where s.praca = praca.IDPRACA and s.pista = pista.IDPISTA) 
left 
join MCR_TBSTATUSLANEALIVE statusSltProxy 
on statusSltProxy.IDPISTA = pista.IDPISTA 
and statusSltProxy.IDPRACA = praca.IDPRACA 
left 
join MCR_TBSTATUSANTENA statusAntena 
on statusAntena.IDPISTA = pista.IDPISTA 
and statusAntena.IDPRACA = praca.IDPRACA 
left 
join MCR_TBSTATUSMCRCOMPUTADOR statusMcr 
on statusMcr.IDPISTA = pista.IDPISTA 
and statusMcr.IDPRACA = praca.IDPRACA 
and statusMcr.IDSLT = pista.IDSLT 
left 
join MCR_TBCHAVESMCR chavesMcr 
on chavesMcr.IDSLT = pista.IDSLT 
left 
join MCR_TBSTATUSPISTA statusPista 
on statusPista.IDPRACA = praca.IDPRACA 
and statusPista.IDPISTA = pista.IDPISTA 

Ich brauche das letzte Register der Tabelle MCR_TBSTATUSGEACOMSLT (alias statusSltPista) zu bekommen, so dass ich, dass die Unterabfrage mit max tun. Jedoch habe ich diesen Fehler:

  1. 00000 - "a column may not be outer-joined to a subquery" *Cause: (+) () is not allowed. *Action: Either remove the (+) or make a view out of the subquery. In V6 and before, the (+) was just ignored in this case.

Ich verstehe, was es mir erzählt, aber ich weiß wirklich nicht, wie es zu tun.

Irgendwelche Ideen?

Vielen Dank.

+0

Es gibt keine [PL/SQL] (http://stackoverflow.com/tags/plsql/info) in der Frage. Ich denke du meintest [SQL] (http://stackoverflow.com/tags/sql/info). –

Antwort

1

Sie können es stattdessen eine JOIN zu einer Inline-Ansicht machen:

Statt dessen:

left join MCR_TBSTATUSGEACOMSLT statusSltPista 
on statusSltPista.IDPRACA = praca.IDPRACA 
and pista.IDPISTA = statusSltPista.PISTA 
and statusSltPista.IDSTATUSGEACOMSLT = (select max(s.IDSTATUSGEACOMSLT) from MCR_TBSTATUSGEACOMSLT s where s.praca = praca.IDPRACA and s.pista = pista.IDPISTA) 

Sie dies tun können:

left join (
    select IDPRACA, PISTA, max(IDSTATUSGEACOMSLT) as Max_IDSTATUSGEACOMSLT 
    from MCR_TBSTATUSGEACOMSLT 
    group by IDPRACA, PISTA 
) statusSltPista 
on statusSltPista.IDPRACA = praca.IDPRACA 
and statusSltPista.PISTA = pista.IDPISTA 

Nur sicher sein, die "verweisen max "Spalte an anderer Stelle in der Abfrage korrekt - mit dem obigen Beispiel wäre dieser Wert statusSltPista.Max_IDSTATUSGEACOMSLT