unir tipos tablas solo repetidos registros left inner ejemplos consultas comparar coincidentes buscar agrupar sql join union

tipos - unir dos registros en un solo sql



Fusionar dos filas en SQL (5)

Hay algunas maneras que dependen de algunas reglas de datos que no ha incluido, pero aquí hay una forma de usar lo que ha dado.

SELECT t1.Field1, t2.Field2 FROM Table1 t1 LEFT JOIN Table1 t2 ON t1.FK = t2.FK AND t2.Field1 IS NULL

De otra manera:

SELECT t1.Field1, (SELECT Field2 FROM Table2 t2 WHERE t2.FK = t1.FK AND Field1 IS NULL) AS Field2 FROM Table1 t1

Suponiendo que tengo una tabla que contiene la siguiente información:

FK | Field1 | Field2 ===================== 3 | ABC | *NULL* 3 | *NULL* | DEF

¿Hay alguna manera de que pueda realizar un seleccionar sobre la mesa para obtener lo siguiente

FK | Field1 | Field2 ===================== 3 | ABC | DEF

Gracias

Editar: corrige el nombre del campo2 para mayor claridad


Las funciones agregadas pueden ayudarte aquí. Las funciones agregadas ignoran los NULLs (al menos eso es cierto en SQL Server, Oracle y Jet / Access), por lo que podría usar una consulta como esta (probada en SQL Server Express 2008 R2):

SELECT FK, MAX(Field1) AS Field1, MAX(Field2) AS Field2 FROM table1 GROUP BY FK;

Utilicé MAX , pero cualquier agregado que elija un valor entre las filas GROUP BY debería funcionar.

Datos de prueba:

CREATE TABLE table1 (FK int, Field1 varchar(10), Field2 varchar(10)); INSERT INTO table1 VALUES (3, ''ABC'', NULL); INSERT INTO table1 VALUES (3, NULL, ''DEF''); INSERT INTO table1 VALUES (4, ''GHI'', NULL); INSERT INTO table1 VALUES (4, ''JKL'', ''MNO''); INSERT INTO table1 VALUES (4, NULL, ''PQR'');

Resultados:

FK Field1 Field2 -- ------ ------ 3 ABC DEF 4 JKL PQR


Puede haber métodos más claros, pero el siguiente podría ser un enfoque:

SELECT t.fk, ( SELECT t1.Field1 FROM `table` t1 WHERE t1.fk = t.fk AND t1.Field1 IS NOT NULL LIMIT 1 ) Field1, ( SELECT t2.Field2 FROM `table` t2 WHERE t2.fk = t.fk AND t2.Field2 IS NOT NULL LIMIT 1 ) Field2 FROM `table` t WHERE t.fk = 3 GROUP BY t.fk;

Caso de prueba:

CREATE TABLE `table` (fk int, Field1 varchar(10), Field2 varchar(10)); INSERT INTO `table` VALUES (3, ''ABC'', NULL); INSERT INTO `table` VALUES (3, NULL, ''DEF''); INSERT INTO `table` VALUES (4, ''GHI'', NULL); INSERT INTO `table` VALUES (4, NULL, ''JKL''); INSERT INTO `table` VALUES (5, NULL, ''MNO'');

Resultado:

+------+--------+--------+ | fk | Field1 | Field2 | +------+--------+--------+ | 3 | ABC | DEF | +------+--------+--------+ 1 row in set (0.01 sec)

Al ejecutar la misma consulta sin la WHERE t.fk = 3 , devolvería el siguiente conjunto de resultados:

+------+--------+--------+ | fk | Field1 | Field2 | +------+--------+--------+ | 3 | ABC | DEF | | 4 | GHI | JKL | | 5 | NULL | MNO | +------+--------+--------+ 3 rows in set (0.01 sec)


Tuve un problema similar. La diferencia era que necesitaba mucho más control sobre lo que estaba devolviendo, así que terminé con una consulta simple pero bastante larga. Aquí hay una versión simplificada basada en su ejemplo.

select main.id, Field1_Q.Field1, Field2_Q.Field2 from ( select distinct id from Table1 )as main left outer join ( select id, max(Field1) from Table1 where Field1 is not null group by id ) as Field1_Q on main.id = Field1_Q.id left outer join ( select id, max(Field2) from Table1 where Field2 is not null group by id ) as Field2_Q on main.id = Field2_Q.id ;

El truco aquí es que la primera selección ''principal'' selecciona las filas para mostrar. Luego tiene una selección por campo. Lo que se está uniendo debe ser todos los mismos valores devueltos por la consulta ''principal''.

Ten en cuenta que esas otras consultas solo deben devolver una fila por identificación o ignorarás los datos


si una fila tiene valor en la columna field1 y otras filas tienen valor nulo, entonces esta consulta podría funcionar.

SELECT FK, MAX(Field1) as Field1, MAX(Field2) as Field2 FROM ( select FK,ISNULL(Field1,'''') as Field1,ISNULL(Field2,'''') as Field2 from table1 ) tbl GROUP BY FK