Обновление в Oracle 11g - PullRequest
       11

Обновление в Oracle 11g

2 голосов
/ 17 февраля 2009

Я должен обновить поле в таблице. Я использую следующие запросы. Помогите мне, какой из них прав?

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 ]

8 голосов
/ 17 февраля 2009

Ни один из них не является правильным. Из вашего фрагмента непонятно, что вы пытаетесь сделать, но синтаксис для обновления одной таблицы значениями из другой будет больше похож на:

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 - запрет на обновление всех несопоставленных строк таблицы 1 нулями.

Другой метод, который работает, когда table1 имеет значение «ключ сохранен» в запросе:

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 голосов
/ 17 февраля 2009
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 = значение1 будет t2.value1 , но будет t1.value1 , если отсутствует t2.value1 .

3 голосов
/ 17 февраля 2009

Исходя из вашего последнего замечания, вам необходимо обновить таблицу table1 с фиксированными значениями, которых нет в таблице базы данных. Но только для строк в таблице 1, которые соответствуют определенным строкам в таблице 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'
);
1 голос
/ 17 февраля 2009

Я использовал следующий запрос:

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

все работало нормально ..

Но когда я использовал его для обновления нескольких столбцов, он выдал ошибку:

Отсутствует правая скобка.

Не могли бы вы помочь ...

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';
0 голосов
/ 10 октября 2013

В вашем запросе вы используете две таблицы в условии условия where. Поэтому вам нужно либо присоединиться, либо подзапросить, либо объединить тип, используйте, чтобы вы могли получить правильный вывод

0 голосов
/ 18 февраля 2009

Я должен добавить значения по событию click1. Я использовал следующий код:

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 обновленных строк. Почему это так?

помощь ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...