【问题标题】:SQL Update a table based on join with anther tableSQL 根据与另一个表的联接更新表
【发布时间】:2011-07-31 20:48:09
【问题描述】:

我正在尝试通过将值与另一个表连接来更新表。 到目前为止,这是我的查询。

    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

谢谢

【问题讨论】:

    标签: sql oracle oracle10g ora-00933


    【解决方案1】:

    如果您希望更新 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' )
    

    【讨论】:

    • 非常感谢您的帮助和时间,非常感谢。到目前为止,您的回答非常好,更详细,并且您提出了对大型数据集进行更新的极好点。让我试试,然后回复你。再次感谢:)。
    • 它就像一个魅力。非常感谢您抽出宝贵的时间,最后您能否推荐一些资源(书籍、文章),以从初级到专家级掌握 sql。谢谢
    【解决方案2】:

    试试

     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

    【讨论】:

    • 非常感谢您的帮助和时间,非常感谢。
    【解决方案3】:

    您的语法不太正确。这个Wikipedia article 有许多示例可供您选择。

    例如

    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'
    

    【讨论】:

    • 谢谢,我试过了,我收到了这个错误。 [错误代码:933,SQL 状态:42000] ORA-00933:SQL 命令未正确结束
    • 非常感谢您的帮助和时间,非常感谢。
    • 并非该文章中的所有示例都适用于 Oracle。甚至在我几个月前修复它之前,甚至 Oracle 特定版本也无法使用。那篇文章很好地说明了为什么 Wikipedia 不是一个好的编程资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多