2017-07-18 54 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`