2011-01-28 41 views
6

esto podría ser bastante simple. No veo la madera para los árboles en este momento. En Oracle estoy seleccionando registros de la tabla A que se une a la tabla B en base a la clave primaria de la tabla A. Sin embargo, la tabla B puede tener múltiples registros que coincidan con la clave primaria de la tabla A. Esto hace que mi consulta devuelva filas duplicadas de la tabla A. a continuación se muestra una versión reducida de mi consulta:PL/SQL - Cómo devolver una sola fila desde una tabla unida

TableA    TableB 
_______    _________ 
1, Sec1    2, 11/01/2011 
2, Sec2    2 
3, Sec3    5, 10/01/2011 
4, Sec4    6, 10/01/2011 

Select A.SecID, A.SecName, B.DateSent from tableA A 
    inner join tableB B on A.SecID = B.SecID 

Esto está regresando 2 registros para Sec2 - ¿Cómo puedo conseguir que vuelva a sólo 1 registro para Sec2? He intentado usar distintos y únicos, pero aún obtengo los mismos resultados.

+0

Disculpas, esto simplificó al principio esto. De hecho, también necesito un valor de fecha de la tabla B –

+2

¿Valor de fecha de cuál de los dos registros? – Quassnoi

+0

El registro en la tabla B con la fecha más reciente. Algunos de los registros pueden no tener un valor de fecha. –

Respuesta

12
SELECT secid, secname 
FROM tableA 
WHERE secid IN 
     (
     SELECT secid 
     FROM tableb 
     ) 

Si necesita un registro de tableB así:

SELECT secid, secname, datesent 
FROM (
     SELECT a.secid, a.secname, b.datesent, ROW_NUMBER() OVER (PARTITION BY a.secid ORDER BY b.datesent DESC) AS rn 
     FROM tableA a 
     JOIN tableB b 
     ON  b.secid = a.secid 
     ) 
WHERE rn = 1 

ORDER BY controles cláusula cuál de los múltiples registros de b va a conseguir.

+0

bueno que hizo el truco :) –

0
SELECT DISTINCT a.secid, a.secname 
    FROM tableA a, tableB b 
WHERE a.secid = b.secid; 
2

Se puede utilizar una función de grupo para seleccionar sólo una fila:

SELECT A.SecID, A.SecName, max(B.DateSent) DateSent 
    FROM tableA A 
    JOIN tableB B on A.SecID = B.SecID 
GROUP BY A.SecID, A.SecName 
+0

Hola @Vincent gracias - mi consulta completa tiene unos 40 campos, por lo que esto significa agregar todos los campos excepto B.DateSent a la cláusula Group By, a menos que haya una manera diferente. –

+0

Si tiene muchos campos, la solución de Quassnoi es definitivamente el camino a seguir. –

0

Las soluciones propuestas son muy buenos. Hay casos en que puede tener un enfoque un poco diferente, especialmente cuando una de las tablas es muy grande en comparación con otra y la ausencia de un índice en la columna clave externa en la tabla B.

Cuestiones relacionadas