MySQL-基于联接表列值更新列值

MySQL-基于联接表列值更新列值,mysql,join,sql-update,Mysql,Join,Sql Update,我一直在阅读SO和其他网站,并遵循了一些例子;但是,我的SQL语句仍然没有按要求执行 我有两张桌子 及 我想把零件表改成 parts ============================ pmkParts fnkManufacturer ---------------------------- 0 45 1 56 2 12 这是我尝试过的SQL语句 Update part

我一直在阅读SO和其他网站,并遵循了一些例子;但是,我的SQL语句仍然没有按要求执行

我有两张桌子



我想把零件表改成

          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
   )
这会更改正确的列,但会用“null”而不是外键(制造商)填充它。我想应该有一个加入的地方,但我不知道在哪里

有什么建议吗

---------- 编辑:答复: 下面是有效的SQL语句。谢谢MarcB的帮助

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

尝试使用更新联接查询更改查询,如下所示。同样,您加入的列是错误的,实际上您应该加入
manufacturer.manufacturer

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

您的
pmkManufacturer
看起来像
int
,因此最好向
零件添加新的int字段,更新它,然后删除旧列。像这样的

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 

最好的解决方案是使用内部联接,例如:

update parts p
inner join manufacturer m on
    p.pmkManufacturer = m.Manufacturer
set p.pmkManufacturer = m.pmkManufacturer
然而,在你的情况下,如果我错了,你想更新
pmkManufacturer
,而
pmkManufacturer
实际上是内部连接的条件
ON
,所以我不确定是否可以请求。如果没有,也不难,您可以添加一个新列:
pmk_bis_manufacturer
并将值设置到此列中,然后删除旧列
pmkManufacturer
,并在必要时更改新列的名称


给您一个提示:列数据库的名称,我更喜欢设置:
pmk_制造商
而不是
pmk制造商
,因为名称中有大写字母 将来可能会有一个问题。例如:对于ORM学说, 这不好:D


这些字段是什么类型的?您不能接受字符串字段/fk并将其更新为仍然指向同一外部字段的整数。@MarcB fnkManufacturer是一个varchar(50),您不应该执行
,其中man.manufacturer=parts.fnkmanufac
?您正在比较错误的字段,因此没有匹配项,并且您从子选择中得到空/空结果。谢谢@MarcB。。这是一个简单的解决办法。我的SQL语句在我更改那一行后就起作用了。谢谢。我实际上从未尝试过您的SQL语句,但您的评论是正确的。我比较了错误的列,一旦我修复了,它工作得很好。谢谢你的选择。我现在已经找到了解决办法,但你肯定有道理。。在接下来的几周里,我可能不得不做同样的查询,然后再回顾一下。
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 
update parts p
inner join manufacturer m on
    p.pmkManufacturer = m.Manufacturer
set p.pmkManufacturer = m.pmkManufacturer