2009-02-12 8 views
5

J'ai deux tables impliquées dans cette requête que je dois créer, et je ne suis pas exactement sûr comment joindre ces deux tables afin de mettre à jour.MISE A JOUR utilisant deux tables, Concaténation

J'ai une table ITEM et CONSUMER_ITEMS. La table ITEM a un code distinct pour chaque élément et un code UPC. Je dois concaténer une chaîne avec le ITEM.UPC_CODE à CONSUMER_ITEMS.NEW_ITEM_CODE où CONSUMER_ITEMS.ITEM_CODE = (liste spécifique des ITEM.ITEM_CODES)

Comment pourrais-je aller sur la mise à jour du CONSUMER_ITEMS.NEW_ITEM_CODE Field?

Il serait essentiellement égal à 'chaîne' || ITEM.UPC mais comment puis-je référencer le CONSUMER_ITEMS.ITEM_CODE pour être égal au ITEM_CODE spécifique dans la liste des ITEM_CODES à mettre à jour.

Répondre

9

Sons comme vous voulez:

UPDATE consumer_items ci 
SET new_item_code = (SELECT 'string' || item.upc_code 
         FROM item 
         WHERE item.item_code = ci.item_code 
         ) 
WHERE ci.item_code IN ('a','b','c'); 

Alternativement, en supposant qu'il existe une relation de clé étrangère entre les tables et consumer_items a une clé primaire, cela devrait fonctionner:

UPDATE (SELECT ci.id, ci.new_item_code, item.upc_code 
     FROM consumer_items ci 
       JOIN item ON item.item_code = ci.item_code 
     WHERE ci.item_code IN ('a','b','c') 
     ) v 
SET v.new_item_code = 'string' || v.upc_code 

EDIT: Ajouté WHERE clauses

+0

Fondamentalement, mon article .item_code = ('SET OF VALUES') qui référencerait item_codes dans CONSUMER_ITEMS – jlrolin

+0

Voulez-vous dire comme je l'ai ajouté ci-dessus? –

+0

Assez bizarrement, il a gagné; t permettez-moi de modifier une vue, et la première déclaration apporte plusieurs valeurs dans une erreur de sous-requête – jlrolin

0

À droite, ça a l'air génial mais le item.item_code = ci.item_code ne fonctionne pas parce que:

SELECT distinct i.code, i.upc 
FROM item i, consumer_items ci 
WHERE i.ccode = '123132' 
AND i.scode = 'ACTIVE' 
AND i.upc IS NOT NULL 
AND ci.item_code = i.code 
AND i.code IN 
    (SELECT DISTINCT tr.item_code 
    FROM t_r tr 
    WHERE tr.category = 'RRE') 
AND ci.NEW_ITEM_CODE IS NULL 

Il s'agit de la liste distincte des codes CODES et UPC associés aux codes qui seront utilisés pour mettre à jour CONSUMER_ITEMS.

new_item_code = (SELECT 'string' || item.upc_code FROM item WHERE item.item_code = (SELECT distinct i.code, i.upc 
FROM item i, consumer_items ci 
WHERE i.ccode = '123132' 
AND i.scode = 'ACTIVE' 
AND i.upc IS NOT NULL 
AND ci.item_code = i.code 
AND i.code IN 
    (SELECT DISTINCT tr.item_code 
    FROM t_r tr 
    WHERE tr.category = 'RRE') 
AND ci.NEW_ITEM_CODE IS NULL)); 

ne semble pas fonctionner

+0

Désolé, mais je n'ai pas compris tout ça! Peut-être avons-nous besoin de voir des exemples de données? –

+0

voir ci-dessus pour une meilleure explication. – jlrolin

0

La liste des i.ITEM_CODE, i.UPC est la suivante:

014940 070182132137 
018266 929245021085 
018268 729245021108 
018418 029245022815 
018419 129245022822 
018420 229245022839 
018421 529245022846 
018422 929245022853 

La première colonne est CODES ITEM, deuxième colonne est UPCs. C'est sur la table ITEMS.

La table CONSUMER_ITEMS contient essentiellement un CONSUMER_ITEMS.ITEM_CODE. C'est le LINK, mais il a aussi un champ appelé CONSUMER_ITEMS.NEW_ITEM_CODE. Nous voulons remplir le NEW_ITEM_CODE avec le CUP de l'ITEM_CODE correspondant dans la liste ci-dessus avec une concaténation de 'chaîne' || CODE CUP AU-DESSUS.

Comment nous générons cette liste est la suivante:

SELECT distinct i.code, i.upc 
FROM item i, consumer_items ci 
WHERE i.ccode = '123434' 
AND i.scode = 'ACTIVE' 
AND i.upc IS NOT NULL 
AND ci.item_code = i.code 
AND i.code IN 
(SELECT DISTINCT tr.item_code 
FROM tr_table tr 
WHERE tr.category = 'RRE') 
AND ci.NEW_ITEM_CODE IS NULL 

Cela génère la ITEM_CODE, la liste ci-dessus UPC. J'ai besoin de mettre à jour les CONSUMER_ITEMS qui correspondent à ces codes ci-dessus. Plus précisément, j'ai besoin de mettre à jour leurs champs NEW_ITEM_CODE, qui sont null, avec le CUP correspondant concaténé avec un STRING.

-3

/* + BYPASS_UJVC */

utiliser cette astuce si vous obtenez l'oracle error- suivant ORA-01779: ne peut pas modifier une colonne qui mappe à une table non clé préservée

Questions connexes