2011-01-17 15 views
7

Me gustaría devolver la primera fila solo desde una unión interna. Tengo dos tablas:Necesita una fila solo devuelta por INNER JOIN

TABLE_X | TABLE_Y 
id  | id creationdate xid 
1  | 1 01/01/2011 1 
2  | 2 01/01/2011 1 
3  | 3 31/12/2010 2 
4  | 4 28/12/2010 3 

filas de la tabla Y pueden tener fechas de creación idénticos, así que estoy primero recibiendo el MAX (creationdate) y luego a continuación, MAX (id) de este conjunto, por ejemplo:

SELECT a.id, 
     c.id, 
     d.id, 
     e.id, 
     d.CREATIONDATE, 
     a.REFNUMBER, 
     a.DATECREATED, 
     a.DESCRIPTION, 
     e.CATEGORYCODE, 
     e.OUTSTANDINGAM_MONAMT, 
     e.PREVPAIDAMOUN_MONAMT, 
     e.TOTALINCURRED_MONAMT, 
     e.LOSSFROMDATE, 
FROM 
TABLE_A a 
INNER JOIN TABLE_B b ON (b.id = a.id) 
INNER JOIN TABLE_C c ON (c.id = b.id) 
INNER JOIN TABLE_D d ON 
(
    c.i = 
    (
     select 
     d.id 
     FROM TABLE_D 
     WHERE TABLE_D.id = c.id 
     AND TABLE_D.id = 
     (
     select 
     max(id) 
     from TABLE_D t1 
     where c_id = c.id 
     and CREATIONDATE = 
     (
      select 
      max(CREATIONDATE) 
      from TABLE_D t2 
      where t2.c_id = t1.c_id 
     ) 
    ) 
    ) 
) 

INNER JOIN TABLE_E e ON 
(
    d.i = 
    (
     select 
     e.d_id 
     from TABLE_E 
     where d_id = d.id 
     AND id = 
     (
     select 
     max(id) 
     from e t1 
     where e.d_id = d.id 
     and CREATIONDATE = 
     (
      select 
      max(CREATIONDATE) 
      from TABLE_E t2 
      where t2.d_id = t1.d_id 
     ) 
    ) 
    ) 
) 

Esto funciona cuando la llamo por sí mismo, pero cuando lo agrego a una combinación interna me estoy haciendo una fila para cada fila coincidente en Y. mesa

lo que quiero es el último disco de creationdate y id donde XID = id de TABLE_X.

+0

¿Puede mostrarnos su intento de unión interna? –

+0

Lo que dijo Marcelo. El problema probablemente yace en JOIN, en sí mismo. ¿Se está uniendo a ID o MAX (id), por ejemplo? –

+1

El MAX (id) - ¿es la columna de identificación de X o Y? –

Respuesta

0

"cuando lo agrego a una unión interna"? ¿Qué unión interna? con qué unión interna? La pregunta está mal underspecified, pero creo que necesita esto (sólo utilizan puntos de vista para ser claro, se puede fácilmente sólo los puso en los apoyos y construir uno grande de la consulta):

-- latest pairs of (id,creation) per xid 
create view latest_id_per_xid as 
    select xid,max(id) id,max(creation) creation from table_y group by xid; 

-- this view leaves only the rows from table_y that have the same (id,creation,idx) 
-- as the newest rows identified in the former view (it's basically a semijoin) 
-- you could also join on id alone 
create view latest_whole_y as 
    select table_y.* from table_y natural join latest_id_per_xid; 

-- now the answer is easy: 
select * from table_x join latest_whole_y 

tengo ninguna base de datos a la mano para busca pequeños errores, pero debería funcionar bien. (advertencia: la gran suposición es que nunca tiene un registro con una nueva identificación y la fecha más antigua)

1

Esto debería bastar El complejo subconsulta calcula la fecha máxima para cada grupo Y.xid, ya partir de ese, trabaja más fuera del Max Y_ID (deje que esto representa la llave en la mesa y)

SELECT X.*, Y.* 
FROM TABLE_X X 
INNER JOIN (
    SELECT t1.xid, Max(t1.Y_id) MaxY_id 
    FROM 
     (SELECT t2.xid, MAX(t2.CREATIONDATE) MDate 
     FROM TABLE_Y t2 
     GROUP BY t2.xid) t 
    inner join TABLE_Y t1 
     on t.xid=t1.xid and t.MDate = t1.CREATIONDATE) MAXY 
    ON MAXY.xid = X.ID 
INNER JOIN TABLE_Y Y 
    ON Y.Y_ID = MAXY.MAXY_ID 
2

Intentar esta consulta

select *,(
select top 1 creationdate from Table_Y 
where from Table_Y.xId = m.id 
order by Table_Y.CreationDate 
) 
from Table_X m 

la consulta sub escogerá el 1 arriba resultado que tiene creationdate máximo y la consulta principal recogerá todos los registros o tiene el resultado deseado

+0

Esto no funcionará en Oracle, ya que Oracle no tiene 'TOP' y los comodines tienen que tener la tabla especificada si hay columnas adicionales. – Allan

Cuestiones relacionadas