SQLite: combinación externa completa con cuatro tablas con más de 30 columnas

Esta pregunta es una extensión de esta publicación
Quiero unir cuatro tablas diferentes con SQLite que tienen solo dos columnas en común. Sin embargo, suponga que hay más de 30 columnas, es decir, más que las columnas a – h . Por favor, eche un vistazo al siguiente ejemplo

Tabla 1:

ab lon lat --------------- 22 33 11 22 

Tabla 2:

 cd lon lat --------------- 1 2 44 45 

Tabla 3

 ef lon lat ----------------------- NULL NULL 100 101 

Table4

 gh lon lat ----------------------- NULL NULL 200 201 

La solución actual es la siguiente

 SELECT a,b,NULL AS c, NULL AS d,NULL AS e, NULL AS f, NULL AS g, NULL AS h, lon,lat FROM table1 UNION ALL SELECT NULL, NULL,c,d,NULL AS e, NULL AS f, NULL AS g, NULL AS h, lon,lat FROM table2 UNION ALL SELECT NULL, NULL,NULL,NULL,e,f, NULL AS g, NULL AS h, lon,lat FROM table3 UNION ALL SELECT NULL, NULL,NULL,NULL,NULL,NULL,g,h, lon,lat from table4 

Resultado:

 +------+------+------+------+------+------+------+------+-----+-----+ | a | b | c | d | e | f | g | h | lon | lat | +------+------+------+------+------+------+------+------+-----+-----+ | 22 | 33 | NULL | NULL | NULL | NULL | NULL | NULL | 11 | 22 | | NULL | NULL | 1 | 2 | NULL | NULL | NULL | NULL | 44 | 45 | | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 100 | 101 | | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 200 | 201 | +------+------+------+------+------+------+------+------+-----+-----+ 

MANIFESTACIÓN

  • Problema: ¿Qué pasa si no tengo solo las columnas a hasta h, pero a hasta z, es decir, muchas columnas en table1, table2, table3 y table4 -> Sería muy lento y la estructura no sería clara si Tuve que escribir en todas partes NULL como [letra] en mi statement sql
  • @zarruq fue de gran ayuda y sugirió que en ese caso solo puedo usar `UNION ALL` y luego` PIVOT` para convertir columnas en filas
  • Sin embargo, no estoy seguro de cómo hacer eso. Y, no sé al 100% qué quiere decir con eso.
  • EDITAR: SQLite no admite pivote: ¿Alguna otra sugerencia?

No creo que haya una manera particularmente buena de hacerlo cuando tienes más de 30 columnas. Lo siguiente es lo mejor que puedo hacer, usando CTE nesteds para implementar uniones exteriores completas , y luego uso coalesce para elegir el primer Lat / Lon no nulo.

Todavía se requiere enumerar los más de 30 campos en la statement SELECT superior, pero al less las lists masivas de NULL AS ... no son necesarias:

 SELECT a, b, c, d, e, f, g, h, coalesce(lat1, lat2, lat3, lat4) AS lat, coalesce(lon1, lon2, lon3, lon4) AS lon FROM ( WITH t1_x_t2 AS ( SELECT t1.*, t2.*, t1.lat AS lat1, t2.lat AS lat2, t1.lon AS lon1, t2.lon AS lon2 FROM table1 t1 LEFT OUTER JOIN table2 t2 ON 0 UNION ALL SELECT t1.*, t2.*, t1.lat AS lat1, t2.lat AS lat2, t1.lon AS lon1, t2.lon AS lon2 FROM table2 t2 LEFT OUTER JOIN table1 t1 ON 0 ), t3_x_t4 AS ( SELECT t3.*, t4.*, t3.lat AS lat3, t4.lat AS lat4, t3.lon AS lon3, t4.lon AS lon4 FROM table3 t3 LEFT OUTER JOIN table4 t4 ON 0 UNION ALL SELECT t3.*, t4.*, t3.lat AS lat3, t4.lat AS lat4, t3.lon AS lon3, t4.lon AS lon4 FROM table4 t4 LEFT OUTER JOIN table3 t3 ON 0 ) SELECT t1_x_t2.*, t3_x_t4.* FROM t1_x_t2 LEFT OUTER JOIN t3_x_t4 ON 0 UNION ALL SELECT t1_x_t2.*, t3_x_t4.* FROM t3_x_t4 LEFT OUTER JOIN t1_x_t2 ON 0 ) 

Una forma de derivar el resultado usando pivot() (si su dbms admite) podría ser el siguiente.

 select a,b,c,d,e,f,g,h,lon,lat from ( select 'a' as columnName1, a as val1,'b' as ColumnName2, b as val2, lon,lat from table1 union all select 'c',c,'d', d, lon,lat from table2 union all select 'e',e,'f', f, lon,lat from table3 union all select 'g',g,'h', h, lon,lat from table4 ) t1 PIVOT (MAX(val1) FOR columnName1 IN (a,c,e,g)) as Pivot1 PIVOT (MAX(val2) FOR columnName2 IN (b,d,f,h)) AS Pivot2; 

Resultado:

 +------+------+------+------+------+------+------+------+-----+-----+ | a | b | c | d | e | f | g | h | lon | lat | +------+------+------+------+------+------+------+------+-----+-----+ | 22 | 33 | NULL | NULL | NULL | NULL | NULL | NULL | 11 | 22 | | NULL | NULL | 1 | 2 | NULL | NULL | NULL | NULL | 44 | 45 | | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 100 | 101 | | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 200 | 201 | +------+------+------+------+------+------+------+------+-----+-----+ 

MANIFESTACIÓN

PD: Tenga en count que la consulta anterior es para sql-Server , por lo que probablemente necesite cambiarla por su dbms .