2010-11-20 17 views
11

Tengo 3 consultas SQL diferentes de 3 tablas diferentes no relacionadas (todas usan LIMIT y ORDER BY).PosgreSQL: Cómo unir 3 tablas ordenadas por fecha

me gustaría combinar y ordenar los resultados de acuerdo con el campo "fecha" (que aparece en todos ellos)

¿Cuál es el SQL para hacer esto?

Respuesta

15

La mejor manera es crear una nueva tabla que contenga los campos comunes de las otras tres tablas y agregar un índice en el campo de fecha común. Las tres tablas originales deben contener una clave externa que vincule a la tabla común. Con este diseño, la consulta se vuelve simple:

SELECT * 
FROM common_table 
ORDER BY "date" DESC 
LIMIT 100 

Si también necesita datos de las tablas más específicos que se pueden utilizar LEFT JOIN seleccionar también que los datos en la misma consulta.

Si no puede cambiar su diseño y el rendimiento no es un problema, puede utilizar UNION ALL para combinar los resultados de las tres mesas antes de la clasificación:

SELECT * FROM table1 
UNION ALL 
SELECT * FROM table2 
UNION ALL 
SELECT * FROM table3 
ORDER BY "date" DESC 
LIMIT 100 

Tenga en cuenta que lo anterior sólo funcionará si todas las tablas tienen la misma estructura. Si tiene campos que aparecen en una tabla pero no en otras, entonces debe omitirlos de SELECT o bien devolver NULL para esa columna en las otras tablas. Por ejemplo, si:

  • table1 tiene columnas a, b, c y date.
  • table2 tiene columnas b, c y date.
  • table3 tiene columnas a, c y date.

A continuación, utilice la siguiente:

SELECT a, b, c, "date" 
FROM table1 
UNION ALL 
SELECT NULL AS a, b, c, "date" 
FROM table2 
UNION ALL 
SELECT a, NULL as b, c, "date" 
FROM table3 
ORDER BY "date" DESC 
LIMIT 100 
+3

¿Qué hay de rendimiento, si tres tablas tienen muchos registros? – vietean

9
SELECT..... 
UNION ALL 
SELECT.... 
UNION ALL 
SELECT ... 
ORDER BY date_field; 

Para el mejor rendimiento, aplicar ORDER BY/LIMIT lo más tarde posible, y evitar que en subconsultas.

Cuestiones relacionadas