2017-07-18 85 views
1

我查詢的目的是使用值從一個表從另一個表B中查找相應的值,然後使用該值從另一個表C.該值查找另一個值然後應該用於更新原始表A.MySQL的 - 更新選擇問題

列在我的查詢到目前爲止,我已成功地獲得使用該命令從表C值的正確列表。在此命令中,DisbursementsEmployee_Details & List_State_Codes分別對應於表A,B & C作爲如上所述。

SELECT `List_State_Codes`.`Code` 
FROM `List_State_Codes` 
LEFT JOIN (
`Employee_Details` , `Disbursements` 
) ON ( `Employee_Details`.`STATE` = `List_State_Codes`.`STATE`) 
WHERE `Employee_Details`.`EmployeeID` = `Disbursements`.`EmployeeID` 

這將返回值的正確列表的要求:一是從表C值在表A的每一行現在我的問題是,這些返回的值更新從表一中所需的列。這是我卡住的地方。

下面的查詢是什麼,我認爲是我最親近的嘗試:

UPDATE `Disbursements` 
SET `Disbursements`.`CostCentreID` = 
(
    SELECT `List_State_Codes`.`Code` 
    FROM (SELECT * FROM `List_State_Codes`) AS `table` 
    LEFT JOIN (
    `Employee_Details` , `Disbursements` 
    ) ON ( `Employee_Details`.`STATE` = `List_State_Codes`.`STATE`) 
    WHERE `Employee_Details`.`EmployeeID` = `Disbursements`.`EmployeeID` 
) 

我收到

錯誤#1093 - 您不能指定目標表「付款」的更新中FROM子句,儘管添加了FROM(SELECT * FROM List_State_Codes)AS錶行。

感謝您的幫助。

回答

0

您可以在更新加盟,這可以幫助從子查詢中刪除有問題的表:

UPDATE `Disbursements` 
JOIN `Employee_Details` 
    ON `Employee_Details`.`EmployeeID` = `Disbursements`.`EmployeeID` 
LEFT JOIN `List_State_Codes` 
    ON `Employee_Details`.`STATE` = `List_State_Codes`.`STATE` 
SET `Disbursements`.`CostCentreID` = `List_State_Codes`.`Code` 

但是,我不能對此進行測試,所以讓我知道,如果這有助於。 (或者,如果發生其他一些錯誤)

+0

謝謝保羅。你給它的代碼產生一個錯誤'#1066 - 不是唯一的表/別名:'Employee_Details''。有一點谷歌搜索表明這是表別名錯誤。我想你的幫助我找到了正確的答案! – Stringers

+0

我在上面的答案中更新了左連接子句,因爲我不應該將Employee_Details添加到左連接中。本來應該是'List_State_Codes'。該更改應避免出現「不唯一...」錯誤。 (並且沒有表別名需要) –

+0

是的,我剛剛回滾了我爲測試查詢所做的更改,並且它完美地工作。再次感謝您的幫助,我會將其標記爲正確,因爲它是比我更好的解決方案。 – Stringers

0

由於保羅的幫助下,我已經找到了正確的解決我的問題。第二次加入是我在Paul建議的時候需要的,以及一個額外的表別名,以防止經典的#Error 1903。我還需要添加List_State_Codes(表三)到JOIN,以確保它能夠訪問正確的數據。

UPDATE `Disbursements` 
JOIN `Employee_Details` 
    ON `Employee_Details`.`EmployeeID` = `Disbursements`.`EmployeeID` 
LEFT JOIN (
    `Employee_Details` d, 
    `List_State_Codes` 
) ON 
    `Employee_Details`.`STATE` = `List_State_Codes`.`STATE` 
SET `Disbursements`.`CostCentreID` = `List_State_Codes`.`Code`