SQL Обновление таблицы на основе соединения с другой таблицей - PullRequest
2 голосов
/ 01 августа 2011

Я пытаюсь обновить таблицу, соединив значения с другой таблицей.Вот мой запрос.

    UPDATE LOGIN  SET LOGIN.DISABLED_IND = 'N', LOGIN.DREASON = 'Test'
        FROM  CONTACT
        WHERE CONTACT.CONTACT_ID = LOGIN.CONTACT_ID 
        AND CONTACT.RID ='abc'

Когда я запускаю это, я получаю это

[Error Code: 933, SQL State: 42000] ORA-00933: SQL command not properly ended

Спасибо

Ответы [ 3 ]

2 голосов
/ 01 августа 2011

Если вы планируете обновить большую часть строк в LOGIN, вероятно, будет более эффективно использовать EXISTS

UPDATE LOGIN  l
   SET l.DISABLED_IND = 'N', 
       l.DREASON = 'Test'
 WHERE EXISTS (
    SELECT 1
      FROM CONTACT c
     WHERE c.CONTACT_ID = l.CONTACT_ID 
       AND c.RID ='abc' )

Если вы обновляете относительно небольшую часть строк в LOGIN, подход Yahia к использованию IN, вероятно, будет более эффективным

UPDATE LOGIN  l
   SET l.DISABLED_IND = 'N', 
       l.DREASON = 'Test'
 WHERE l.contact_id IN (
    SELECT c.contact_id
      FROM CONTACT c
     WHERE c.RID ='abc' )
2 голосов
/ 01 августа 2011

try

 UPDATE LOGIN L SET L.DISABLED_IND = 'N', L.DREASON = 'Test'
 WHERE L.CONTACT_ID 
 IN ( SELECT C.CONTACT_ID FROM CONTACT C WHERE C.CONTACT_ID = L.CONTACT_ID AND 
 C.RID='abc');

Еще один более сложный вариант см. http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx

0 голосов
/ 01 августа 2011

Ваш синтаксис не совсем правильный.Эта статья в Википедии содержит ряд примеров, которые вы можете выбрать.

Например

UPDATE l
 SET l.DISABLED_IND = 'N', l.DREASON = 'Test'
 FROM LOGIN l
  JOIN CONTACT c
   ON c.CONTACT_ID = l.CONTACT_ID AND c.RID ='abc'
...