2016-07-15 2 views
3

Je tente de mettre à jour le champ GPID de la table DIM_TRADING_ACCOUNTS en fonction du champ GPID de MASTER_CUSTOMER où le MCUST_CODE dans MASTER_CUSTOMER est égale à la TRADING_CODE de DIM_TRADING_ACCOUNTS et peu importe ce que j'essaie, je reçois ce qui revient essentiellement à une erreur de syntaxe à chaque fois. J'ai suivi les conseils de this question. Les quatre tentatives que j'ai faites jusqu'ici sont ci-dessous avec des erreurs. Quelqu'un peut-il m'aider s'il vous plaît à obtenir la syntaxe appropriée pour Oracle SQL qui fonctionne?Oracle SQL Update Table basées sur la correspondance ID

Note: J'utilise supérieur sur mcust_code car le champ trading_code est tout en majuscules

Tentative 1(erreur: commande SQL pas correctement terminé)

UPDATE dim_trading_accounts dta 
    SET dta.gpid = mc.gpid 
FROM master_customer mc 
WHERE UPPER(mc.mcust_code) = dta.trading_code; 

Tentative 2(l'erreur est: mot clé "SET" manquant)

UPDATE 
    dim_trading_accounts dta, master_customer mc 
SET 
    dta.gpid = mc.gpid 
WHERE 
    upper(mc.mcust_code) = dta.trading_code; 

Tentative 3(celui-ci renvoie l'erreur: sous-requête une seule rangée retourne plus d'une ligne)

UPDATE dim_trading_accounts dta 
SET dta.gpid = (SELECT mc.gpid 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)) 
WHERE EXISTS (SELECT 1 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)); 

Tentative 4(erreur: manque "ON" mot-clé)

MERGE INTO dim_trading_accounts 
    USING master_customer 
    ON dim_trading_accounts.trading_code = upper(master_customer.mcust_code) 
WHEN MATCHED THEN 
    UPDATE 
    SET dim_trading_accounts.gpid = master_customer.gpid; 

Répondre

2

Vous devez utiliser max ou min dans la sous-requête pour éviter l'erreur single-row subquery returns more than one row.

UPDATE 
    dim_trading_accounts dta 
SET 
    dta.gpid = (SELECT MAX(gpid) 
       FROM master_customer 
       WHERE upper(mcust_code) = dta.trading_code); 

Pour comprendre pourquoi l'erreur apparaît, utilisez un select et vérifier les résultats pour gpid et tradingcode combinaison.

SELECT mc.gpid, dta.trading_code 
FROM master_customer mc 
JOIN dim_trading_accounts dta ON upper(mc.mcust_code) = dta.trading_code 

Si vous voyez des lignes en double de ce qui précède select, vous pouvez être sûr d'utiliser max ou min dans le update.

+0

oui, je découvre cela et la chose intéressante est que je filtré le '' mccust_code' avec plusieurs gpid' et j'ai toujours l'erreur. * (Je les ai filtrés parce que je veux mettre à jour le reste et vérifier les multiples manuellement) * –

+0

pouvez-vous montrer la requête complète que vous utilisez alors? –

+0

Nevermind, j'ai trouvé les deux autres délinquants que j'ai manqué par hasard :) ... merci pour l'aide :) Je pense que je l'ai eu droit maintenant :) ... même si je n'ai pas utilisé la solution 'max' parce que J'ai besoin d'être précis sur ce qui est mis à jour, je vais choisir cette réponse car elle m'a amené dans la bonne direction. –

3

Attemp 3 est correcte syntaxiquement, le problème est les données dans la table: semble que master_customer filtré par trading_code renvoie plus d'une ligne. Est-ce correct? Dans ce cas, il n'y a aucun moyen de faire la mise à jour que vous recherchez car à un seul trading_code peuvent être associées différentes valeurs gpid.

Solution: mise à jour uniquement dans le cas où il y a exactement une seule valeur gpid pour tous les enregistrements liés:

UPDATE dim_trading_accounts dta 
SET dta.gpid = (SELECT MIN(mc.gpid) 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)) 
WHERE (SELECT COUNT(DISTINCT gpid) 
       FROM master_customer mc 
       WHERE dta.trading_code = upper(mc.mcust_code)) = 1;