web-dev-qa-db-fra.com

Unioning deux tables avec un nombre différent de colonnes

J'ai deux tables (Table A et Table B).

Celles-ci ont un nombre différent de colonnes - Dites que le tableau A a plus de colonnes.

Comment puis-je unir ces deux tables et obtenir null pour les colonnes que la table B n'a pas?

79
Jack Kada

Ajouter des colonnes supplémentaires comme null pour la table ayant moins de colonnes comme

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2
162
Kangkan

Je suis venu ici et j'ai suivi la réponse ci-dessus. Mais le décalage dans le type de données Order a provoqué une erreur. La description ci-dessous d'une autre réponse vous sera utile.

Les résultats ci-dessus sont-ils identiques à la séquence de colonnes de votre tableau? car Oracle est strict dans les ordres de colonnes. Cet exemple ci-dessous génère une erreur:

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: l'expression doit avoir le même type de données que l'expression correspondante

Comme vous le constatez, la cause première de l'erreur réside dans l'ordre de concordance des colonnes, qui est impliqué par l'utilisation de * en tant que spécificateur de liste de colonnes. Ce type d'erreur peut être facilement évité en entrant explicitement dans la liste des colonnes:

sélectionnez col_a, col_b, col_c dans test1_1790 union allselect col_a, col_b, col_c dans test2_1790; Un scénario plus fréquent de cette erreur survient lorsque vous permutez (ou déplacez) par inadvertance deux colonnes ou plus dans la colonne Liste SELECT:

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

OR si ce qui précède ne résout pas votre problème, pourquoi ne pas créer un ALIAS dans les colonnes de la manière suivante: (la requête n’est pas la même que la vôtre, mais le point ici est comment ajouter un alias dans la colonne .)

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

si seulement 1 ligne, vous pouvez utiliser join

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;
0
Sai Sai

Normalement, vous devez avoir le même nombre de colonnes lorsque vous utilisez des opérateurs basés sur un ensemble afin que la réponse de Kangkan soit correcte.

SAS SQL a un opérateur spécifique pour gérer ce scénario: 

Guide de l'utilisateur de la procédure SQL (SQL) 9.3

CORRESPONDANT (CORR) Mot clé

Le mot clé CORRESPONDING est utilisé uniquement lorsqu'un opérateur de groupe est spécifié. CORR oblige PROC SQL à faire correspondre les colonnes dans les expressions de table par leur nom et non par leur position ordinale. Les colonnes dont le nom ne correspond pas sont exclues de la table des résultats, à l'exception de l'opérateur OUTER UNION.

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

Pour:

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

OUTER UNION CORR

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

<=>

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

U-SQL supporte un concept similaire:

UNION EXTÉRIEURE PAR NOM SUR (*)

EXT&EACUTE;RIEUR

requiert la clause BY NAME et la liste ON. Contrairement aux autres expressions définies, le schéma de sortie de OUTER UNION inclut à la fois les colonnes correspondantes et les colonnes non correspondantes des deux côtés. Cela crée une situation où chaque ligne provenant de l’un des côtés possède des "colonnes manquantes" qui ne sont présentes que de l’autre côté. Pour ces colonnes, les valeurs par défaut sont fournies pour les "cellules manquantes". Les valeurs par défaut sont null pour les types nullable et la valeur par défaut .Net pour les types non nullable (par exemple, 0 pour int).

DE NOM

est requis en cas d'utilisation avec OUTER. La clause indique que l'union met en correspondance des valeurs non basées sur la position mais sur le nom des colonnes. Si la clause BY NAME n'est pas spécifiée, la correspondance est effectuée positionnellement.

Si la clause ON inclut le symbole “*” (il peut être spécifié en tant que dernier ou unique membre de la liste), les correspondances de noms supplémentaires sont autorisées au-delà de celles de la clause ON et les colonnes du résultat incluent toutes les colonnes correspondantes dans la liste. ordre ils sont présents dans l'argument de gauche.

Et code:

@result =    
    SELECT * FROM @left
    OUTER UNION BY NAME ON (*) 
    SELECT * FROM @right;
0
Lukasz Szozda