2016-02-13 144 views
0

Tables Involved我期待基於另一個表的列的值的條件修改一個表上的列的值。更新值基於另一個表中的值

我使用的代碼:

UPDATE ORDERDETAIL 
SET ORDERDETAIL.PRODUCTID = 'BASE1' 
WHERE CUSTOMER.FIRSTNAME = 'JANE' AND CUSTOMER.LASTNAME = 'DOE'; 

這應該是很簡單的,我要去哪裏錯了?

+1

你可以運行這個沒有得到任何錯誤?除此之外,看起來您缺少訂單明細和客戶之間的連接。您是否在訂單明細表中有任何客戶Id列? –

回答

0

您沒有明確指定第二個TABLE。加入應該工作。記住,總是表示別名,而不是表名旁邊的UPDATE

UPDATE O_T 
SET PRODUCTID = 'BASE1' 
from ORDERDETAIL O_T 
JOIN CUSTOMER C_T 
ON O_T.SOME_COLUMN_NAME=C_T.SOME_COLUMN_NAME 
WHERE C_T.FIRSTNAME = 'JANE' AND C_T.LASTNAME = 'DOE'; 
+0

仍然錯誤: 錯誤起始於線:1命令 - UPDATE O_t同 SET PRODUCTID = 'BASE1' 從的OrderDetail O_t同 JOIN CUSTOMER C_T ON O_T.SOME_COLUMN_NAME = C_T.SOME_COLUMN_NAME WHERE C_T.FIRSTNAME ='簡和C_T.LASTNAME = 'DOE' 錯誤在命令行:3列:1個 錯誤報告 - SQL錯誤:ORA-00933:SQL命令不能正確地結束 00933. 00000 - 「SQL命令不能正確地結束」 *原因: *操作: –

+0

ON O_T.SOME_COLUMN_NAME = C_T.SOME_COLUMN_NAME 您必須更改「SOME _COLUMN_NAME「分配到您表格中的相應列。我給了SOME_COLUMN_NAME,因爲我看不到你的表格結構。 – Chendur

+0

是的,我做了正確的代碼: UPDATE O_t同 SET PRODUCTID = 'BASE1' FROM的OrderDetail O_t同 INNER JOIN客戶C_T ON O_T.PRODUCTID = C_T.CUSTOMERID WHERE C_T.FIRSTNAME ='簡和C_T。 LASTNAME ='DOE'; 但它仍然失敗。我在某處錯過了你的觀點嗎?對不起。 –

0

如果你總是使用固定的值,你的使用exists找到匹配其他表中的條件,其記錄:

UPDATE ORDERDETAIL OD 
SET OD.PRODUCTID = 'BASE1' 
WHERE EXISTS (
    SELECT NULL 
    FROM CUSTOMER C 
    JOIN ORDERS O ON O.CUSTOMERID = C.CUSTOMERID 
    WHERE C.FIRSTNAME = 'JANE' 
    AND C.LASTNAME = 'DOE' 
    AND O.ORDERID = OD.ORDERID 
); 

或子查詢:

UPDATE ORDERDETAIL OD 
SET OD.PRODUCTID = 'BASE1' 
WHERE OD.ORDERID IN (
    SELECT O.ORDERID 
    FROM CUSTOMER C 
    JOIN ORDERS O ON O.CUSTOMERID = C.CUSTOMERID 
    WHERE C.FIRSTNAME = 'JANE' 
    AND C.LASTNAME = 'DOE' 
); 

甲骨文doesn't allow you有一個更新語句直接加入。如果您從另一張表中獲得新值,那麼您應該使用something like this

相關問題