MySQL - 根据连接的表列值更新列值

时间:2016-07-08 18:49:11

标签: mysql join sql-update

我一直在阅读SO和其他网站,并做了几个例子;但是,我的SQL语句仍未按要求执行。

我有两张桌子

          parts
============================
pmkParts    fnkManufacturer
----------------------------
   0          Penn-Union
   1          Schneider
   2         Telemecanique

         manufacturer   
===============================
Manufacturer    pmkManufacturer
-------------------------------
 Penn-Union          45
 Schneider           56
Telemecanique        12

我想将零件表更改为

          parts
============================
pmkParts    fnkManufacturer
----------------------------
   0             45
   1             56
   2             12

这是我试过的SQL语句。

Update parts
SET parts.fnkManufacturer = (
   SELECT manufacturer.pmkManufacturer
   FROM manufacturer
   WHERE manufacturer.pmkManufacturer = parts.fnkManufacturer
   )

即更改正确的列,但它使用'NULLS'而不是外键(制造商)填充它。我认为那里应该有一个加入,但我不确定在哪里。

任何提示?

----------

编辑:答案:

这是有效的SQL语句。感谢MarcB的帮助。

Update parts
SET parts.fnkManufacturer = (
   SELECT manufacturer.pmkManufacturer
   FROM manufacturer
   WHERE manufacturer.Manufacturer= parts.fnkManufacturer
   )

3 个答案:

答案 0 :(得分:1)

尝试使用更新联接查询更改您的查询,如下所示。同样,你加入了错误的专栏,你实际应该加入manufacturer.Manufacturer专栏。

Update parts p
JOIN manufacturer m ON m.Manufacturer = p.fnkManufacturer
SET p.fnkManufacturer = m.pmkManufacturer;

答案 1 :(得分:1)

您的pmkManufacturer看起来像int所以最好将新的int字段添加到parts,更新它然后删除旧列。这样的事情。

alter table dbo.parts add pmkManufacturer int
update dbo.parts 
    set pmkManufacturer = m.pmkManufacturer 
from dbo.parts p
     inner join dbo.Manufacturer m on p.fnkManufacturer = m.manufacturer 

答案 2 :(得分:0)

最好的解决方案,你可以使用INNER JOIN,例如:

update parts p
inner join manufacturer m on
    p.pmkManufacturer = m.Manufacturer
set p.pmkManufacturer = m.pmkManufacturer

Howerver,在您的情况下,如果我错了,您想更新pmkManufacturer,而pmkManufacturer实际上是INNER JOIN的条件ON所以我不确定它是什么'好的请求。如果没有,也不难,你可以添加一个新列:pmk_bis_manufacturer并将值设置到此列中,然后删除旧列pmkManufacturer并在必要时更改新列的名称。

  

给您一个提示:列数据库的名称,我更喜欢设置:   pmk_manufacturer代替pmkManufacturer,因为名称中有大写字母   可能会在未来中产生一个问题。例如:对于ORM Doctrine,   这不好:D