2014-07-18 3 views
0

J'ai une liste de produits dans la table, les produits. Cela peut contenir plus de 5 millions d'enregistrements.Mise à jour d'une colonne à l'aide des valeurs d'une table de recherche

prod_code prod_region  prod_desc  prod_type 
------------------------------------------------------ 
1001  R2    r2 asdasa 
1001  R1    r1 erfffv 
1002  R4    r4 vfdser 
1003  R2    r2 sdfdfv 

prod_code et prod_region ne sont pas Nullable.

J'ai besoin de mettre à jour le type prod dans cette table, en sélectionnant dans une autre table de recherche, type_produit.

prod_type prod_code prod_region 
----------------------------------- 
1   1001 
2   1002 
2   1003 
3   1001  R1 

Dans cette table, prod_region peut être null. Si elle est nulle, elle devrait être interprétée comme Anything.

donc ma table de produits mis à jour doit être,

prod_code prod_region  prod_desc  prod_type 
------------------------------------------------------ 
1001  R2    r2 asdasa  1  
1001  R1    r1 erfffv  3 
1002  R4    r4 vfdser  2 
1003  R2    r2 sdfdfv  2 

Explication de la sortie désirée.

  1. Pour prod_code = 1001, il y a deux entrées dans product_type. prod_type = 3 pour prod_region spécifique 'R1' et prod_type = 1 pour le reste des régions. Ainsi, les deux premiers enregistrements dans les produits devraient obtenir 1 et 3 respectivement.
  2. Pour prod_code 1002, 1003, il n'y a pas de prod_region spécifiée dans la table product_type. Donc les troisième et quatrième enregistrements sont assignés à prod_type = 2 indépendamment de la région prod_.

La déclaration de fusion suivante échoue en raison de ORA-30926: unable to get a stable set of rows in the source tables dans Oracle ou Failure 7547 Target row updated by multiple source rows. dans Teradata.

merge into products 
using product_type 
on (products.prod_code = product_type.prod_code 
    and products.prod_region = coalesce(product_type.prod_region,products.prod_region) 
    ) 
when matched then update 
set products.prod_type = product_type.prod_type; 

Vous recherchez une réponse spécifique SQL ou Teradata standard.

Répondre

1

Au lieu d'une déclaration compliquée que vous pourriez le diviser en deux Fusionne simples:

merge into products 
using product_type 
    on products.prod_code = product_type.prod_code 
    and product_type.prod_region is null 
when matched then update 
set prod_type = product_type.prod_type; 

merge into products 
using product_type 
    on products.prod_code = product_type.prod_code 
    and products.prod_region = product_type.prod_region 
when matched then update 
set prod_type = product_type.prod_type; 
1

Que diriez-vous quelque chose comme ceci:

update products 
set prod_type = (
    select T.prod_type 
    from product_type T 
    where T.prod_code = products.prod_code 
    and (
     T.prod_region = product.prod_region 
     or (
      T.prod_region is null 
      and not exists (
       select 1 
       from product_type T2 
       where T2.prod_code = products.prod_code 
       and T2.prod_region = product.prod_region 
      ) 
     ) 
    ) 
) 

Bien que l'on peut remettre en question la raison pour dénormaliser vos données comme celui-ci.

Questions connexes