基于联接4个表来更新表

时间:2019-01-28 19:26:05

标签: mysql join sql-update

我有下表:

代理

+-------------------------------------+
| id  |  name   | desc     |  comment |
|-------------------------------------+
| 1   |  agent1 | agent 1  | sss      |
| 2   |  agent2 | agent 2  | eee      |
|-------------------------------------| 

agent_old

+-------------------------------------+
| id  |  name   | desc     |  comment |
|-------------------------------------+
| 1   |  agent1 | agent 1  | sss      |
| 2   |  agent3 | agent 3  | eee      |
|-------------------------------------|

身份验证

+-------------------------------+
| id  |  login   | password     |  
|-------------------------------+
| 1   |  agent1  | xxxxxxx      |
| 2   |  agent2  | yyyyyy       |
|-------------------------------| 

auth_old

+-------------------------------+
| id  |  login     | password   |
|-------------------------------+
| 1   |  oldagent1 | wwwwww     |
| 2   |  oldagent2 | qqqqqq     |
|-------------------------------|  

我需要这样的结果表:

代理

+-------------------------------------+
| id  |  name   | desc     |  comment |
|-------------------------------------+
| 1   |  agent1 | agent 1  | sss      |
| 2   |  agent2 | agent 2  | eee      |
|-------------------------------------| 

身份验证

+-------------------------------+
| id  |  login   | password     |  
|-------------------------------+
| 1   |oldagent1 | wwwwww       |
| 2   |  agent2  | yyyyyy       |
|-------------------------------| 

这是我得到的但没有运行:

update auth a 
set 
    a.login = oa.login, 
    a.password = oa.password 
from (
    select o.login, 
    o.password 
    from auth_old o 
    join agent na 
    join agent_old ago 
    on ago.id = o.id 
    and na.name = ago.name 
    and na.desc = ago.desc
    ) oa 
where a.id = na.id

1 个答案:

答案 0 :(得分:1)

在mysql中,您可以使用此sintax,但您在(select)oa中没有id。我为此添加了o.id(希望是正确的)

    update auth a 
    inner join  (
        select o.login, 
        o.password , 
        na.id
        from auth_old o 
        join agent na 
        join agent_old ago 
        on ago.id = o.id 
        and na.name = ago.name 
        and na.desc = ago.desc
        ) oa  on a.id = oa.id
    set 
        a.login = oa.login, 
        a.password = oa.password 

(并且按照Bill Karvin的建议,您使用了错误的表别名na而不是oa)

相关问题