4 votos

¿Cómo unir dos tablas con fecha, hora, lat y lon como campo común?

Lo siento si la pregunta es elemental pero no encontré ninguna discusión clara o guía para entender cómo ejecutar una consulta en postgresql. Para que un puntero a otro sitio web también sería útil. De todos modos, tengo dos tablas:

Tabla 1
id|día|hora|lat|lon|
1a|2010-09-12|4:35:04/44.66038/10.74039|
2a|2010-09-12|13:04:38/44.65472/10.76201|
3a|2010-09-12,15:41:55,44.65450/10.76198|
4a|2010-09-12|15:43:54/44.65469/10.76197|
5a|2010-09-12|15:44:26/44.65476/10.76199|
6a|2010-09-12|15:45:40/44.65480/10.76202|
7a|2010-09-18|07:22:00/44.65480/10.76202|
8a|2010-09-18|07:23:57/44.65477/10.76186|
9a|2010-09-18|07:47:32/44.65470/10.76199|

Tabla 2
id|día|hora|lat|lon|salida/llegada
1b|2010-09-12|4:35:04/44.66038/10.74039|D
2b|2010-09-12|15:45:40/44.65480/10.76202|Un
3b|2010-09-18|07:47:32/44.65470/10.76199|D

La tabla 2 se ha obtenido de la tabla 1 y se incluye una columna adicional: salida/llegada. Esta columna indica si la coordenada (o fila), es la primera coordenada de un camino (D) o de la última coordenada (Una).

El uso de postgres, me gustaría usar como campo común de las dos tablas "día", "hora", "lat", "lon" con el fin de obtener una nueva tabla 3 que incluye todos los campos de la tabla 1, más el "salen/llegan" campo de la tabla 2.

Tabla 3
id|día|hora|lat|lon|salida/llegada
1a|2010-09-12|4:35:04/44.66038/10.74039|D
2a|2010-09-12|13:04:38/44.65472/10.76201|NULL
3a|2010-09-12,15:41:55,44.65450/10.76198|NULL
4a|2010-09-12|15:43:54/44.65469/10.76197|NULL
5a|2010-09-12|15:44:26/44.65476/10.76199|NULL
6a|2010-09-12|15:45:40/44.65480/10.76202|Un
7a|2010-09-18|07:22:00/44.65480/10.76202|NULL
8a|2010-09-18|07:23:57/44.65477/10.76186|NULL
9a|2010-09-18|07:47:32/44.65470/10.76199|D

Muchas gracias de antemano.

4voto

hernan43 Puntos 566

Todos los que aprenden SQL deberían conocer el LEFT JOIN. Básicamente une todo desde la tabla izquierda a las "uniones" del lado derecho. Cuando no hay coincidencias, los datos de la derecha son nulos, pero se sigue consultando la parte izquierda. Wikipedia tiene un buen artículo sobre las uniones .

SELECT A.id, A.day, A.time, A.lat, A.lon, B.depart_arrive
FROM table_1 AS A
LEFT JOIN table_2 AS B ON A.id = B.id AND A.day = B.day AND A.time = B.time AND
                          A.lat = B.lat AND A.lon = B.lon
ORDER BY A.id, A.day, A.time, A.lat, A.lon, B.depart_arrive;

Esto no es "tabla_3", pero puede SELECT ... INTO table_3 FROM ... o crear una vista para que los datos unidos estén siempre actualizados en algo parecido a una tabla.


Como nota al margen, en lugar de almacenar dos columnas para day y time es más eficaz utilizar una columna para timestamp (con zona horaria). Lo mismo para sus datos de localización, que podrían almacenarse como un PostgreSQL tipo de punto o PostGIS geometry o geography tipos . Estos añaden otras funciones SIG y pueden mejorar el rendimiento de las búsquedas con un índice optimizado.

0voto

Sajee Puntos 11

Gracias a todos. La consulta funciona y he podido visualizar el resultado en las ventanas de salida de datos. Para obtener la tabla_3 utilicé SELECT A.id, A.day, A.time, A.lat, A.lon, B.depart_arrive INTO table_3 ...

0voto

Niall C. Puntos 1234

Tienes la idea correcta pero necesitarías otro campo para concatenarlos todos.
o ya que estás en posgres quizás una vista con los campos concat.
una vez tengas el campo el join se completará como muestra lynxlynxlynx.

EDITAR:

  1. crear un compuesto pk y fk . Puede que funcione por lo que he leído.
  2. utilizar la unión

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X