Oracle 11g中的更新

时间:2009-02-17 09:23:42

标签: sql oracle sql-update

我必须更新表格中的字段。我正在使用以下查询。帮助我,哪一个是对的?

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

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

哪一个是对的?或两者都不正确?请提出一些建议...

6 个答案:

答案 0 :(得分:8)

两者都不正确。从你的片段中不清楚你想要做什么,但用另一个表更新一个表的语法更像是:

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);

最后的WHERE子句是为了防止用空值更新所有不匹配的table1行。

查询中table1为"key preserved"时另一种有效的方法是:

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;

答案 1 :(得分: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

请记住始终限定SET语句,即t2.value1 。不明确时不会抛出任何错误。换句话说, SET col1 = value1 将是 t2.value1 ,但如果 t2.value1 将 t1.value1 strong>失踪。

答案 2 :(得分:3)

根据您的上一条注释,您需要使用不在数据库表中的固定值更新表table1。 但仅适用于table1中与表2中的特定行匹配的行。 在这种情况下,您可以使用以下声明:

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'
);

答案 3 :(得分:1)

我使用了以下查询:

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

它运作良好..

但是当我用它来更新多个cols时,它产生了一个错误:

  

缺少右括号。

你能帮忙......

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';

答案 4 :(得分:0)

我必须在button1的click事件上添加值。我使用了以下代码:

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

这不会更新行,但在后端触发相同的查询时会更新行。

从前端更新时,显示0行已更新。为什么会这样?

帮助..

答案 5 :(得分:-1)

在您的查询中,您在where子句条件中使用了两个表。因此,您必须加入或子查询或合并类型,使用以便您可以获得正确的输出