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