我知道这里有相似的帖子,但我还没有找到适合自己的问题。
在MySQL表格中,我有从外部程序导入的文章。该程序将每篇文章作为父文章和变体发送两次,其中一些列包含其他数据。
我想规范化表格,将其他列数据写入父文章。
我的更新查询如下所示:
UPDATE oxarticles
SET oxean = (SELECT oxean FROM oxarticles WHERE oxparentid = oxid),
oxstock = (SELECT oxstock FROM oxarticles WHERE oxparentid = oxid),
oxinsert = (SELECT oxinsert FROM oxarticles WHERE oxparentid = oxid)
而父母氧化物与儿童/变体的oxparentid柱结合。
不幸的是我收到错误:
Your can’t specify target table for update in FROM clause
我该如何解决这个问题?
答案 0 :(得分:1)
你可以这样做:
UPDATE oxarticles a
LEFT JOIN oxarticles b ON a.oxid=b.oxparentid
SET a.oxean =b.oxean,
a.oxstock =b.oxstock ,
a.oxinsert =b.oxinsert
答案 1 :(得分:0)
解决了它。这是我的解决方案。
UPDATE oxarticles a
SET a.oxean = ( SELECT oxean FROM ( SELECT oxean, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
a.oxstock = ( SELECT oxstock FROM ( SELECT oxstock, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
a.oxinsert = ( SELECT oxinsert FROM ( SELECT oxinsert, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
a.oxsubclass = ( SELECT oxsubclass FROM ( SELECT oxsubclass, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
a.oxsort = ( SELECT oxsort FROM ( SELECT oxsort, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1),
a.oxvarname = '',
a.oxvarstock = 0,
a.oxvarcount = 0,
a.oxvarminprice = 0.00,
a.oxvarmaxprice = 0.00
只是fyi:
AND tmp.oxartnum LIKE '%GrLos%'
只识别表数据中的某种数据类型。在我的情况下,可能存在具有真实变体的文章。更新过程不得触及这些内容,因此我只选择“oxartnum”列中包含字符串“GrLos”的文章。
由于MySQL不支持同一个表中的udate操作,你必须强制MySQL创建一个临时表。这就是我们要对set操作中的子选择所做的事情:
SET a.oxean = ( SELECT oxean FROM ( SELECT oxean, oxparentid, oxartnum FROM oxarticles) tmp WHERE tmp.oxparentid = a.oxid AND tmp.oxartnum LIKE '%GrLos%' LIMIT 0,1)
如果文章中有多个variantes,我将subselect结果限制为1
limit 0,1
也许这可能在将来帮助其他人。