2011-08-25 10 views
12
SELECT * FROM A 
JOIN B 
ON B.ID = A.ID 
AND B.Time = (SELECT max(Time) 
          FROM B B2 
          WHERE B2.ID = B.ID) 

Estoy tratando de unir estas dos tablas en MYSQL. No preste atención a eso si la identificación es única, entonces no estaría tratando de hacer esto. Condensé la solución real para pintar una imagen simplificada. Estoy tratando de agarrarme y unirme a la mesa B en la fecha máxima para un cierto registro. Este procedimiento está siendo ejecutado por un paquete SSIS y dice B2.ID es una columna desconocida. Hago cosas como esta frecuentemente en MSSQL y soy nuevo en MYSQL. Alguien tiene algunos consejos o ideas?Anidada Seleccione la instrucción en MYSQL join

Respuesta

27

Realizo este tipo de consulta de forma diferente, con una exclusión join en lugar de una subconsulta. Desea encontrar las filas de B que tienen el Tiempo máximo para una ID determinada; en otras palabras, donde ninguna otra fila tiene un Tiempo mayor y la misma ID.

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
LEFT OUTER JOIN B AS B2 ON B.ID = B2.ID AND B.Time < B2.Time 
WHERE B2.ID IS NULL 

También se puede utilizar una tabla derivada , que debería funcionar mejor que el uso de una subconsulta correlacionada.

SELECT A.*, B.* 
FROM A JOIN B ON B.ID = A.ID 
JOIN (SELECT ID, MAX(Time) AS Time FROM B GROUP BY ID) AS B2 
    ON (B.ID, B.Time) = (B2.ID, B2.Time) 

P.S .: He añadido la etiqueta greatest-n-per-group. Este tipo de pregunta de SQL aparece cada semana en Stack Overflow, por lo que puede seguir esa etiqueta para ver docenas de preguntas similares y sus respuestas.

+2

¡Excelente respuesta! +1 – shesek

+0

Bueno, muchas gracias – JBone

Cuestiones relacionadas