Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Crear sentencia SELECT..UNION a partir de tablas

Estas en el tema de Crear sentencia SELECT..UNION a partir de tablas en el foro de SQL Server en Foros del Web. Hola a todos Uso SQL2008R2 y tengo 16 tablas, estas tablas tienen "casi" los mismos datos, hay diferencias en cuanto a nombre de campo para ...
  #1 (permalink)  
Antiguo 07/07/2016, 02:15
 
Fecha de Ingreso: abril-2010
Mensajes: 68
Antigüedad: 14 años, 7 meses
Puntos: 0
Crear sentencia SELECT..UNION a partir de tablas

Hola a todos

Uso SQL2008R2 y tengo 16 tablas, estas tablas tienen "casi" los mismos datos, hay diferencias en cuanto a nombre de campo para guardar el mismo dato o hay campos que estan en una y no en otras y no me interesarian. Para que se entienda bien esta cosa loca supongamos que son tablas para clientes diferentes y no se hizo una sola con un campo "codclient" para diferenciar los clientes sino una para cada cliente. Es importante que en lo que se "rediseña" la bbdd pueden crear otra tabla para otro cliente semejante a las anterioriores. Debo entonces crear una consulta que agrupe estos datos de todos los clientes. Para aclarar un poca mas las cosas pongo un código de ejemplo:

USE MyBase;
SET NOCOUNT ON;
IF EXISTS (SELECT name FROM sys.tables WHERE name = 't1')
DROP TABLE t1;
IF EXISTS (SELECT name FROM sys.tables WHERE name = 't2')
DROP TABLE t2;
IF EXISTS (SELECT name FROM sys.tables WHERE name = 't3')
DROP TABLE t3;
DECLARE @sql nvarchar(max)
CREATE TABLE t1 (c1 int,c2 int,c3 int)
insert into t1 values (1,1,1),(1,1,1)
CREATE TABLE t2 (c1 int,c11 int, c21 int,c3 int,c4 int)
insert into t2 values (2,2,2,2,2),(2,2,2,2,2)
CREATE TABLE t3 (c1 int,c2 int,c34 int)
insert into t3 values (3,3,3),(3,3,3)
/*
1.- de t1 me interesan todos los campos, para el cliente que esta en t1
no tengo datos en c4 que si los tienen t2 y t3
2.- de t2 el c1,c21,c3 y c4 (t2.c21 tiene el mismo dato que t1.c2 y t3.c2 pero son clientes diferentes)
3.- de t3 todos, (t3.c34 es el mismo dato que t1.c3 y t2.c3 pero son clientes diferentes)
Para concretar necesito el mismo dato de todos los clientes pero que están en campos con nombres diferentes.
Mi SELECT UNION ALL manual sería asi:
*/

SELECT c1,c2,c3,0 FROM t1
UNION ALL SELECT c1,c21,c3,c4 FROM t2
UNION ALL SELECT c1,c2,c34,0 FROM t3

/*me sale algo parecido si hago:...*/

SELECT @sql = COALESCE(@sql + ''+CHAR(10)+' UNION ALL ','') + 'SELECT '

-- y aqui es donde tengo el problema, la relacion de campos varía

+ 'c1,c2,c3 FROM ' + table_name
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 't[1-9]'
print @sql

¿ alguna sugerencia ?. Gracias.
  #2 (permalink)  
Antiguo 08/07/2016, 15:08
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Crear sentencia SELECT..UNION a partir de tablas

No me queda muy claro, manda el resultado de print @sql
__________________
MCTS Isaias Islas
  #3 (permalink)  
Antiguo 09/07/2016, 11:28
 
Fecha de Ingreso: abril-2010
Mensajes: 68
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Crear sentencia SELECT..UNION a partir de tablas

Hola, este sería el print, funciona bien y se construye correctamente la sentencia si los campos en nombre y posicion son identicos:

SELECT c1,c2,c3 FROM t1
UNION ALL SELECT c1,c2,c3 FROM t2
UNION ALL SELECT c1,c2,c3 FROM t3

Trataré de explicarme mejor con otro ejemplo. Sería las tablas:

clientes1 --- "cod","nombre","apellido","idprovinciapaisclientes 1","direccion","CP"
clientes2 --- "cod","nombre","edad","apellido","idprovinciapaisc lientes2","direccion"
clientes3 --- "cod","nombre","apellido","idprovinciapaisclientes 3","direccion","CP"
.......
clientes16 --- "cod","nombre","apellido"

y me piden una relacion de los nombres, apellidos e id de las provincias de todos los clientes, puedo hacer el UNION a mano:

SELECT cod,nombre,apellido,idprovinciapaisclientes1 FROM clientes1
UNION ALL SELECT cod,nombre,apellidos,idprovinciapaisclientes1 FROM clientes2
UNION ALL SELECT cod,nombre,apellido,idprovinciapaisclientes1 FROM clientes3
UNION .......

pero lo que quiero es automatizarlo porque ahora son 16 tablas pero aumentan. Claro la solucion sencilla es el UNION a mano, le diría a los grandes "diseñadores" o implementadores de la bbdd que cuando agreguen un cliente nuevo me lo digan inmediatamente para agregar en mi consulta la tabla clientes17. Una aclaracion importante, los nombres de los campos con datos iguales son iguales excepto el id de las provincias que apuntan a las tablas provinciasclientes1,provinciasclientes2,.....y provinciasclientes16. Un saludo
  #4 (permalink)  
Antiguo 09/07/2016, 13:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Crear sentencia SELECT..UNION a partir de tablas

y porq no usas los nombres de las columnas, podrias obtener la lista de campos de cada tabla y usar los q requieras, ademas de q necesitas explicarte mejor........
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: insert, select, sentencia, sql, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:16.