Запрос на обновление выполняется в SQL Server, но не в Oracle - PullRequest
2 голосов
/ 04 ноября 2010

Мне нужно, чтобы этот запрос на обновление выполнялся как на SQL Server, так и на Oracle. Наша версия Oracle 10.2, если это имеет значение. Когда я запускаю запрос в Oracle, я получаю сообщение «ОШИБКА ORA-00933: команда SQL неправильно завершена». Что мне нужно сделать, чтобы запустить это в Oracle?

UPDATE dbo.tableUpdate
SET fieldA = tt.fieldB
FROM dbo.tableTranslate tt
WHERE
    tt.fieldC = dbo.tableUpdate.fieldC
    AND
    tt.fieldD = dbo.tableUpdate.fieldA
    AND
    1 = (
        SELECT COUNT(tblTrans.fieldD) 
        FROM dbo.tableTranslate tblTrans
        WHERE 
            tblTrans.fieldC = dbo.tableUpdate.fieldC 
            AND 
            tblTrans.fieldD = dbo.tableUpdate.fieldA
)

Ответы [ 3 ]

6 голосов
/ 04 ноября 2010

Синтаксис UPDATE ... FROM недопустим для Oracle. Вам нужно будет использовать подзапрос, например:

UPDATE dbo.tableUpdate t
SET t.fieldA = (SELECT tt.fieldB
                FROM dbo.tableTranslate tt
                WHERE tt.fieldC = t.fieldC
                AND tt.fieldD = t.fieldA
               )
WHERE 1 = (
        SELECT COUNT(tblTrans.fieldD) 
        FROM dbo.tableTranslate tblTrans
        WHERE tblTrans.fieldC = t.fieldC 
        AND tblTrans.fieldD = t.fieldA
        )
0 голосов
/ 04 ноября 2010

Вам нужно будет полностью переписать ваш запрос для Oracle.Некоторые вещи, которые не будут работать в Oracle 10.2:

  1. from предложение в update предложении (для этого вам нужно написать подвыбор), если у вас на самом деле нет пользователя с именем dbo в oracle, владеющего таблицей, которую вы пытаетесь обновить
0 голосов
/ 04 ноября 2010

Синтаксис для связанного подзапроса немного отличается в Oracle.

UPDATE dbo.tableUpdate
SET fieldA = (select tt.fieldB
FROM dbo.tableTranslate tt
WHERE
    tt.fieldC = dbo.tableUpdate.fieldC
    AND
    tt.fieldD = dbo.tableUpdate.fieldA)
    AND
    1 = (
        SELECT COUNT(tblTrans.fieldD) 
        FROM dbo.tableTranslate tblTrans
        WHERE 
tblTrans.fieldC = dbo.tableUpdate.fieldC 
AND 
tblTrans.fieldD = dbo.tableUpdate.fieldA)
...