2012-01-20 527 views
13

我想通過使用連接來更新oracle SQL開發人員中的記錄。 以下是我的querySQL錯誤:ORA-00933:SQL命令未正確結束

UPDATE system_info set field_value = 'NewValue' 
FROM system_users users 
JOIN system_info info ON users.role_type = info.field_desc 
where users.user_name = 'uname' 

然而,當我試圖執行它,我得到了下面的錯誤 -

Error report: SQL Error: ORA-00933: SQL command not properly ended 
       00933. 00000 - "SQL command not properly ended" 

我試着刪除JOINS

UPDATE system_info info 
SET info.field_value = 'NewValue' 
FROM system_users users 
where users.user_name = 'uname' AND users.role_type = info.field_desc 

,但仍然有同樣的錯誤 有人可以告訴我錯誤的原因和解決辦法

+0

我想你的sqlDevelepor執行了上一行。在你的sql語句之前和之後放一個分號,然後再試一次 –

+0

我試過你的解決方案,但是不適合我 –

回答

12

Oracle不允許在UPDATE語句中連接表。你需要有共同相關的子選擇

像這樣的東西來重寫你的說法:

UPDATE system_info 
SET field_value = 'NewValue' 
WHERE field_desc IN (SELECT role_type 
        FROM system_users 
        WHERE user_name = 'uname') 

有關UPDATE語句的(有效)語法的完整說明,請仔細閱讀本手冊:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10008.htm#i2067715

+0

自評論(2016年11月)以來第一次看到這一點。這不是事實:Oracle確實允許在UPDATE中加入,但有一些限制(明顯的限制,邏輯要求,而不是Oracle要求)。 Oracle不允許更新連接的這種非常普遍的誤解來自哪裏?在這裏討論如何使用連接更新工作:http://stackoverflow.com/questions/37001180/update-with-join-syntax-for-oracle-database – mathguy

+0

@mathguy:Oracle允許更新派生表(sub -query),它可以在某些限制下使用連接(主要是:查詢需要是「保存鍵的表」)。但是,這是不同的,那麼簡單地將目標表連接到另一個表(在那些支持該表的DBMS中通常具有較少的限制)。 –

+0

完全正確 - 這與「Oracle不允許在UPDATE語句中連接表」不同。我知道這一點,顯然你也知道這一點。現在通過SO進行搜索並查看人們做出該聲明的次數,即使在通過連接進行更新的情況下(很多情況下),如果只有人們使用正確的語法,並且他們在源表中具有適當的唯一約束,那麼也可以很好地工作。我剛剛創建了一篇文檔來討論這個問題,我們會看看它是否被批准。 – mathguy

1

您的查詢應該像

UPDATE table_name 
SET column1=value, column2=value2,... 
WHERE some_column=some_value 

您可以檢查幫助

+0

ANSI連接受Oracle – Sathya

+0

支持@Sathya:但不在UPDATE語句中。 –

+0

@a_horse_with_no_name啊。謝謝。 – Sathya

-6

其在Oracle和SQL非常真實的是「用戶」是一個保留字只是改變它, 它將爲U中最好的,如果ü喜歡它改成這樣

UPDATE system_info set field_value = 'NewValue' 

FROM system_users users JOIN system_info info ON users.role_type = info.field_desc where users.user_name = 'uname'

+3

'用戶'是**不**保留字!然而'user'是一個保留字。但真正的問題是,Oracle不允許在UPDATE語句中使用FROM或JOIN。 –

2

不完全是這個問題的實際情境的情況,但這種異常可以通過下面的查詢中被複制:

update users set dismissal_reason='he can't and don't want' where userid=123 

用單引號can'tdon't打破了字符串。 如果字符串只有一個內部引號,例如'他不想'甲骨文拋出更多相關引用的字符串沒有正確終止錯誤,但在兩個情況下SQL命令未正確結束被拋出。

摘要:檢查雙引號的查詢。

10

分號;在命令結束時對我造成了同樣的錯誤。

cmd.CommandText = "INSERT INTO U_USERS_TABLE (USERNAME, PASSWORD, FIRSTNAME, LASTNAME) VALUES (" 
       + "'" + txtUsername.Text + "'," 
       + "'" + txtPassword.Text + "'," 
       + "'" + txtFirstname.Text + "'," 
       + "'" + txtLastname.Text + "');"; <== Semicolon in "" is the cause. 
                 Removing it will be fine. 

希望它有幫助。

相關問題