Unión de dos tablas con diferente número de columnas


Tengo dos tablas (Tabla A y Tabla B).

Estos tienen un número diferente de columnas - Digamos que la tabla A tiene más columnas.

¿Cómo puedo unir estas dos tablas y obtener null para las columnas que la Tabla B no tiene?

 72
Author: zx8754, 2010-02-22

4 answers

Agregue columnas adicionales como null para la tabla que tiene menos columnas como

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2
 148
Author: Kangkan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 09:35:57

Vine aquí y seguí la respuesta anterior. Pero el desajuste en el orden del tipo de datos causó un error. La siguiente descripción de otra respuesta será útil.

¿Son los resultados anteriores los mismos que la secuencia de columnas en su tabla? porque Oracle es estricto en órdenes de columna. este ejemplo a continuación produce un error:

create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);

create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);

select * from test1_1790
union all
select * from test2_1790;

ORA-01790: la expresión debe tener el mismo tipo de datos que la expresión correspondiente

Como puede ver, la causa raíz del error está en desajuste en el orden de las columnas que implica el uso de * como especificador de lista de columnas. Este tipo de errores se pueden evitar fácilmente ingresando la lista de columnas explícitamente:

Seleccione col_a, col_b, col_c de test1_1790 union all seleccione col_a, col_b, col_c de test2_1790; Un escenario más frecuente para este error es cuando inadvertidamente cambia (o cambia) dos o más columnas en la lista de SELECCIÓN:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

O si lo anterior no resuelve su problema, ¿qué tal crear un ALIAS en las columnas como esta: (la consulta no es la misma que la suya, pero el punto aquí es cómo agregar alias en la columna.)

SELECT id_table_a, 
       desc_table_a, 
       table_b.id_user as iUserID, 
       table_c.field as iField
UNION
SELECT id_table_a, 
       desc_table_a, 
       table_c.id_user as iUserID, 
       table_c.field as iField
 6
Author: Anand Varkey Philips,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-23 09:54:48

Si solo 1 fila, puede usar join

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;
 0
Author: Sai Sai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-26 03:42:22

Normalmente necesita tener el mismo número de columnas cuando está utilizando operadores basados en conjuntos, por lo que La respuesta de Kangkan es correcta.

SAS SQL tiene operador específico para manejar ese escenario:

SAS (R) 9.3 Guía del usuario del Procedimiento SQL

Palabra clave CORRESPONDIENTE

La palabra clave CORRESPONDIENTE se usa solo cuando se especifica un operador set. CORR hace que PROC SQL coincida con las columnas en las expresiones de tabla por nombre y no por posición ordinal. Las columnas que no coinciden por nombre se excluyen de la tabla de resultados, excepto para el operador de UNIÓN EXTERIOR.

SELECT * FROM tabA
OUTER UNION CORR
SELECT * FROM tabB;

Para:

+---+---+
| a | b |
+---+---+
| 1 | X |
| 2 | Y |
+---+---+

OUTER UNION CORR

+---+---+
| b | d |
+---+---+
| U | 1 |
+---+---+

<=>

+----+----+---+
| a  | b  | d |
+----+----+---+
|  1 | X  |   |
|  2 | Y  |   |
|    | U  | 1 |
+----+----+---+

U-SQL soporta un concepto similar:

UNIÓN EXTERIOR POR NOMBRE EN (*)

EXTERIOR

Requiere la cláusula BY NAME y la lista ON. A diferencia de las otras expresiones set, el esquema de salida de la UNIÓN EXTERNA incluye tanto las columnas coincidentes como las no coincidentes columnas de ambos lados. Esto crea una situación en la que cada fila que viene de uno de los lados tiene "columnas faltantes" que están presentes solo en el otro lado. Para tales columnas, se proporcionan valores predeterminados para las"celdas faltantes". Los valores predeterminados son null para los tipos null y el valor predeterminado de.Net para los tipos no nullables (por ejemplo, 0 para int).

POR NOMBRE

Se requiere cuando se utiliza con EXTERIOR. La cláusula indica que la unión coincide con valores no basado en la posición pero por el nombre de las columnas. Si no se especifica la cláusula BY NAME, la coincidencia se realiza posicionalmente.

Si la cláusula ON incluye el símbolo " * " (puede especificarse como el último o el único miembro de la lista), entonces se permiten coincidencias de nombres adicionales más allá de las de la cláusula ON, y las columnas del resultado incluyen todas las columnas coincidentes en el orden en que están presentes en el argumento de la izquierda.

Y código:

@result =    
    SELECT * FROM @left
    OUTER UNION BY NAME ON (*) 
    SELECT * FROM @right;
 0
Author: Lukasz Szozda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-05 12:54:51