2009-02-17 3 views
2

Je dois mettre à jour un champ dans une table. J'utilise les requêtes suivantes. Aidez-moi, lequel a raison?Mise à jour dans Oracle 11g

update table1 
set col1=<value>,col2=<value>.... 
from table1 t,table2 s 
where t.id=s.num 
    and s.code='abc'; 

ou

update table1 
set col1=<value>,col2=<value>.... 
where table1.id=table2.num 
    and table2.code='abc'; 

Lequel a raison? Ou les deux sont incorrects? S'il vous plaît suggérer un certain moyen ...

Répondre

8

Ni l'un ni l'autre n'est correct. On ne sait pas à partir de votre fragment ce que vous essayez de faire, mais la syntaxe de mettre à jour une table avec des valeurs d'une autre serait plus comme:

update table1 
set (col1, col2) = 
(select col1, col2 
    from table2 
    where table2.num = table1.id 
    and table2.code = 'abc' 
) 
where table1.id in (select num from table2); 

La dernière clause WHERE est d'empêcher la mise à jour toutes les lignes de table1 non appariés avec des zéros.

Une autre méthode qui fonctionne lorsque table1 est "key preserved" dans la requête est:

update 
(select table1.id, table1.col1, table1.col2 
    ,  table2.col1 as new_col1, table2.col as new_col2 
    from table1 
     join table2 on table2.num = table1.id 
) 
set col1 = new_col1, col2 = new_col2; 
5
MERGE 
INTO table1 t1 
USING (
SELECT * 
FROM table2 
WHERE table2.code = 'abc' 
) t2 
ON (t1.id = t2.num) 
WHEN MATCHED THEN 
    UPDATE 
    SET col1 = t2.value1, col2 = t2.value2 

Souvenez-vous de se qualifier toujours l'instruction SET, à savoir t2.value1. Aucune erreur n'est levée lorsqu'elle est ambiguë. En d'autres termes, SET col1 = valeur1 serait t2.value1, mais serait t1.value1 si t2.value1 était manquante.

1

J'ai utilisé la requête suivante:

update (select col1 from table1 t inner join table2 s 
on t.id=s.num where s.code='abc') t1 
set t1.col1='value'; 

il a bien fonctionné ..

Mais quand je l'ai utilisé pour mettre à jour plusieurs Col., il produit une erreur:

Missing right parenthesis.

pourrait vous aidez ...

update (select col1,col2,col3 from table1 t inner join table2 s 
on t.id=s.num where s.code='abc') t1 
set t1.col1='value',t1.col2='value2',t1.col3='value3'; 
3

D'après votre dernière remarque, vous devez mettre à jour la table table1 avec des valeurs fixes qui ne figurent pas dans une table de base de données. Mais seulement pour les lignes qui correspondent dans le tableau 1 avec des lignes spécifiques dans le tableau 2. Dans ce cas, vous pouvez utiliser cette instruction:

update table1 t1 
set t1.col1='value', 
t1.col2='value2', 
t1.col3='value3' 
where exists (select '' 
       from table2 s 
       where t1.id=s.num 
       and s.code='abc' 
); 
0

je dois ajouter des valeurs sur l'événement de clic de button1. Je l'ai utilisé le code suivant:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    val = TextBox1.Text 

    If RadioButton1.Checked = True Then 
     rcvd = RadioButton1.Text 
    ElseIf RadioButton2.Checked = True Then 
     rcvd = RadioButton2.Text 
    End If 

    If RadioButton5.Checked = True Then 
     type = RadioButton5.Text 
    ElseIf RadioButton6.Checked = True Then 
     type = RadioButton6.Text 
    ElseIf RadioButton7.Checked = True Then 
     type = RadioButton8.Text 
    ElseIf RadioButton9.Checked = True Then 
     type = RadioButton9.Text 
    ElseIf RadioButton10.Checked = True Then 
     type = RadioButton10.Text 
    End If 

    Try 

     XXX = "update(select rcvd,amount,instype,chq,ucode,uname,remarks from fapark04 f inner join sumast04 s on f.party=s.account where s.abnmn=' " & val & " ') fa set fa.rcvd=' " & rcvd & " ', fa.amount= " & TextBox5.Text & " ,fa.instype='" & type & " ',fa.chq= " & TextBox9.Text & " ,fa.ucode=' " & TextBox12.Text & "',fa.uname='" & TextBox13.Text & "',fa.remarks='" & TextBox14.Text & "' " 

     cmd1 = New OracleCommand(XXX, con) 
     cmd1.ExecuteNonQuery() 

    Catch ex As Exception 
     MsgBox("A Run time error occured!!!", ex.ToString) 

    End Try 

End Sub 

Cela ne met à jour pas les lignes mais quand même requête est tiré sur le back-end, il met à jour les lignes.

Lorsqu'il est mis à jour depuis le frontal, il affiche 0 lignes mises à jour. Pourquoi est-ce donc?

aide ..

-1

Dans votre requête, vous utilisez deux tables dans laquelle la condition de la clause. Donc, vous devez soit joindre ou sous-requête ou fusionner le type, utilisez pour que vous puissiez obtenir la sortie correcte