2013-12-09 3 views
0

Мне нужно обновить одну из моих таблиц и не могу заставить синтаксис правильно. Я пробовал несколько разных подходов, но не обедал.Синтаксис Oracle UPDATE с предложением JOIN и WHERE

Я получаю «команда SQL не должным образом закончилась» ошибка с этим ...

UPDATE TESTDTA.F4941 
SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM 
FROM TESTDTA.F4941 
INNER JOIN TESTDTA.F4981 
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN 
WHERE TESTDTA.F4941.RSSHPN = 647143 
AND TESTDTA.F4941.RSDSTN = 0 
AND TESTDTA.F4941.RSADDJ > 110365 
AND TESTDTA.F4981.FHCGC1 = 'DIS'; 

Любая помощь будет принята с благодарностью.

Спасибо,

ответ

0
UPDATE (SELECT * 
FROM TESTDTA.F4941 
INNER JOIN TESTDTA.F4981 
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN 
WHERE TESTDTA.F4941.RSSHPN = 647143 
AND TESTDTA.F4941.RSDSTN = 0 
AND TESTDTA.F4941.RSADDJ > 110365 
AND TESTDTA.F4981.FHCGC1 = 'DIS') 
SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM 

Перемещайте положение SET после соединения.

+0

я получаю эту ошибку с помощью метода. Отчет об ошибке: Ошибка SQL: ORA-00904: «TESTDTA». «F4941»: недопустимый идентификатор 00904. 00000 - «% s: недопустимый идентификатор» – user1521068

+0

@ user1521068 попробуйте его сейчас. – Mihai

+0

Я тоже пробовал это, но все равно ничего хорошего. Отчет об ошибке: Ошибка SQL: ORA-00904: «TESTDTA». «F4981». «FHUOM»: недопустимый идентификатор 00904. 00000 - «% s: недопустимый идентификатор» – user1521068

0

Я предпочитаю merge заявление, когда я должен присоединиться

MERGE INTO TESTDTA.F4941 
USING TESTDTA.F4981 
ON (TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN 
AND TESTDTA.F4941.RSSHPN = 647143 
--AND TESTDTA.F4941.RSDSTN = 0 
AND TESTDTA.F4941.RSADDJ > 110365 
AND TESTDTA.F4981.FHCGC1 = 'DIS' 
) 
WHEN MATCHED THEN 
UPDATE SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ 
      ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM; 
+0

Я получаю эту ошибку, когда я пробую ваш метод. Отчет об ошибке: Ошибка SQL: ORA-00925: отсутствует ключевое слово INTO 00925. 00000 - «отсутствует ключевое слово INTO» – user1521068

+0

@ user1521068: Я добавил в ключевое слово после Merge –

+0

Это работает, если я прокомментирую одно из предложений WHERE (AND TESTDTA .F4941.RSDSTN = 0), но дает мне эту ошибку, если я оставлю ее в ... Ошибка SQL: ORA-38104: Столбцы, указанные в разделе ON, не могут быть обновлены: «TESTDTA». «F4941». «RSDSTN» 38104. 00000 - «Столбцы, на которые ссылаются в объявлении ON, не могут быть обновлены:% s» * Причина: LHS из UPDATE SET содержит столбцы, указанные в разделе ON. – user1521068

0

Вы должны разделить ваш SET от вашего SELECT:

UPDATE TESTDTA.F4941 
SET (TESTDTA.F4941.RSDSTN,TESTDTA.F4941.RSUMD1) = 
(SELECT TESTDTA.F4981.FHRTDQ,TESTDTA.F4981.FHUOM 
... 

мой новый код ...

UPDATE TESTDTA.F4941 
SET TESTDTA.F4941.RSDSTN=TESTDTA.F4981.FHRTDQ,TESTDTA.F4941.RSUMD1=TESTDTA.F4981.FHUOM = (SELECT TESTDTA.F4941.RSSHPN, 
TESTDTA.F4941.RSDSTN, 
TESTDTA.F4941.RSUMD1, 
TESTDTA.F4941.RSADDJ, 
TESTDTA.F4981.FHSHPN, 
TESTDTA.F4981.FHRTDQ, 
TESTDTA.F4981.FHUOM, 
TESTDTA.F4981.FHCGC1 
FROM TESTDTA.F4941 
INNER JOIN TESTDTA.F4981 
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN 
WHERE TESTDTA.F4941.RSSHPN = 647143 
AND TESTDTA.F4941.RSDSTN = 0 
AND TESTDTA.F4941.RSADDJ > 110365 
AND TESTDTA.F4981.FHCGC1 = 'DIS'; 
+0

. Я попробовал ваш метод и получил – user1521068

+0

. У вас все еще есть 'set = 'в вашем заявлении об обновлении. Проверьте мой пост снова.Вы должны иметь 'set (col1, col2, col3 ...) = (выберите col1, col2, col3 ...)'. Не 'set col1 = othertable.col1 ...'. – Andrew

+0

, когда он написан таким образом, он просто петли и никогда не завершает – user1521068

1

Как уже упоминалось ранее, вам нужно переместить набор после выберите ... следующим образом. Однако, как мне кажется, отсутствует предыдущая рекомендация, так это то, что вам нужен псевдоним каждого столбца в списке. например

UPDATE (SELECT TESTDTA.F4941.RSDSTN as A_RDSTN,TESTDTA.F4981.RSDSTN AS B_RSDSTN 
FROM TESTDTA.F4941 
INNER JOIN TESTDTA.F4981 
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN 
WHERE TESTDTA.F4941.RSSHPN = 647143 
AND TESTDTA.F4941.RSDSTN = 0 
AND TESTDTA.F4941.RSADDJ > 110365 
AND TESTDTA.F4981.FHCGC1 = 'DIS') 
SET A_RSDSTN = B_RSDSTN 

Для краткости я привел только пример обновления одного столбца. Вам нужно будет каждый отдельный столб, который необходимо обновить.

Вы также должны учесть, что вам необходимо иметь первичный ключ или уникальный индекс в таблице, которую вы обновляете. В противном случае вы получите «ORA-01779 Невозможно изменить столбец, который отображается в таблице, не содержащей ключ».

+0

, таблица имеет первичный ключ, но она состоит из двух столбцов, а не одного столбца PK. Может ли это быть проблема? – user1521068

+0

, вы также должны быть уверены, что для каждой строки в обновляемой таблице есть ** AT MOST ** одна строка в соединенной таблице. Если это проблема, вам, возможно, придется отказаться от этого подхода к обновляемому выбору и, возможно, с предложением Гуарава использовать инструкцию слияния. –

+0

Пожалуйста, см. [Этот отличный пост] (http://jonathanlewis.wordpress.com/2012/01/06/i-wish-5/) от уважаемого Джонатана Льюиса на обновляемых видах объединений. Посмотрите на комментарии пользователей также о некоторых интересных подходах к устранению ключевых сохраненных ошибок. –

0

, наконец, получил эту работу ...

MERGE INTO TESTDTA.F4941 DST 
USING (SELECT DISTINCT TESTDTA.F4941.RSSHPN, 
    TESTDTA.F4941.RSDSTN, 
    TESTDTA.F4941.RSUMD1, 
    TESTDTA.F4941.RSADDJ, 
    TESTDTA.F4981.FHSHPN, 
    TESTDTA.F4981.FHRTDQ, 
    TESTDTA.F4981.FHUOM, 
    TESTDTA.F4981.FHCGC1 
FROM TESTDTA.F4941 
INNER JOIN TESTDTA.F4981 
ON TESTDTA.F4941.RSSHPN = TESTDTA.F4981.FHSHPN 
WHERE TESTDTA.F4941.RSDSTN = 0 
AND TESTDTA.F4941.RSADDJ > 110365 
AND TESTDTA.F4981.FHCGC1 = 'DIS') SRC 
ON (DST.RSSHPN = SRC.FHSHPN) 
WHEN MATCHED THEN UPDATE 

SET DST.RSDSTN = round(SRC.FHRTDQ/10000,0), DST.RSUMD1 = SRC.FHUOM; 
Смежные вопросы