2012-09-24 8 views
6

Actualizar en la parte inferior.El resultado OUTER JOIN no contiene filas, no hay una cláusula WHERE (Solución alternativa)

Estoy tratando de hacer una unión externa que, para cada registro, la devuelva y todos los demás registros que ocurran después de ella, o NULL si es el último registro. Este es mi código SQL:

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A LEFT OUTER JOIN CR_ADMIN_REGIS_STATUS B 
ON A.[CR#]=B.[CR#] AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

Mi problema es que cuando esto es, para un determinado [CR #], A.REGIS_STATUSDATE es un máximo (y por lo tanto la B.REGIS_STATUSDATE no puede ser mayor que ella), que fila no está incluido en mi resultado.

Por ejemplo, si CR_ADMIN_REGIS_STATUS se ve así:

CR# REGIS_STATUSDATE 
1  5/1/12 
1  5/2/12 
1  5/3/12 
2  5/1/12 
2  5/2/12 

espero que el resultado de mi consulta sea

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
1  5/3/12    NULL 
2  5/1/12    5/2/12 
2  5/2/12    NULL 

En vez me sale esto:

CR# A.REGIS_STATUSDATE B.REGIS_STATUSDATE 
1  5/1/12    5/2/12 
1  5/1/12    5/3/12 
1  5/2/12    5/3/12 
2  5/1/12    5/2/12 

Teniendo en cuenta que mi consulta es una UNIÓN EXTREMA IZQUIERDA, y no tengo ninguna cláusula WHERE, espero que todas las filas de mi tabla original sean en el resultado, pero este no es el caso. ¿Que me estoy perdiendo aqui?

Editar: Esto es en Access 2007

Actualización: Me decidí ver lo que pasaría si he copiado secciones de la tabla CR_ADMIN_REGIS_STATUS en una tabla separada y pasé la consulta contra eso. Incluso cuando acababa de copiar directamente toda la tabla en la nueva (manualmente) ¡la consulta funcionó! Sin embargo, este era solo el caso al copiar y pegar, cuando SELECCIONAR * EN otra mesa, el problema persistía.
el tiempo he descubierto que si me encontré con la consulta contra

SELECT * 
FROM CR_ADMIN_REGIS_STATUS 
UNION ALL SELECT TOP 1 * 
FROM CR_ADMIN_REGIS_STATUS; 

más que en sí CR_ADMIN_REGIS_STATUS mi consulta devuelve el resultado deseado. Extraño. También tuve una consulta similar contra una tabla similar que funcionó desde el principio, por lo que parece que este fue un problema limitado a esta tabla.

+1

Qué DBMS está usando? ¿Acceso? –

+0

Bueno, eso me hizo rascarme la cabeza también –

+0

En MS Access 2010 ejecutando su consulta obtengo el resultado esperado. – Fionnuala

Respuesta

1

No se echa en falta nada. Si esto sucede, es un error.

El motor utilizado por MS-Access tiene varios errores. He visto un comportamiento similar, inactivo en combinaciones que tenían condiciones "complejas" ON. Vea otra pregunta de SO donde Access da resultados erróneos: Why does my left join in Access have fewer rows than the left table?

Puede intentar la consulta con datos idénticos en SQL-Server, Oracle, Postgres, incluso MySQL y obtendrá los resultados correctos y esperados.


Como solución alternativa, puede intentar volver a escribir la consulta con un UNION, pero uno nunca puede estar seguro acerca de la corrección:

SELECT A.[CR#], A.REGIS_STATUSDATE, B.REGIS_STATUSDATE 
FROM CR_ADMIN_REGIS_STATUS A 
    INNER JOIN CR_ADMIN_REGIS_STATUS B 
    ON A.[CR#]=B.[CR#] 
    AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 

UNION ALL 

SELECT A.[CR#], A.REGIS_STATUSDATE, NULL 
FROM CR_ADMIN_REGIS_STATUS A 
WHERE NOT EXISTS 
     (SELECT * 
     FROM CR_ADMIN_REGIS_STATUS B 
     WHERE A.[CR#]=B.[CR#] 
      AND A.REGIS_STATUSDATE < B.REGIS_STATUSDATE 
    ) ; 
+0

Obtengo el resultado esperado en MS Access. – Fionnuala

+0

Gracias por su respuesta rápida, tan decepcionante como es conocer ese error. Voy a probar tu solución. – msender

+0

@Remou: Cuando respondí esa otra pregunta, hice algunas pruebas, con 2 tablas y muy pocas filas, 2 o 3 cada una. Las consultas que tenían 'ON a.id = b.id O a.x IS NULL' o condiciones similares arrojaban resultados muy extraños. –

Cuestiones relacionadas