我正在写一个SQL查询,我需要在同一post_id
的基础上更新伪coloumn中的颜色,以便post_id '1'
所有行都有'abc'
在那里,假coloumn。
同样对于post_id '2'
,所有行在假名下的coloumn中都会有'def'
。
post_id |meta_key|dummy
1 url abc
1 link Null
1 key Null
1 data Null
2 url def
2 link Null
2 key Null
2 data Null
我试过的查询是:
update <table_name>
set dummy = ( select meta_value
from <table_name>
where meta_key = 'url'
AND post_id = '1'
)
where post_id IN ('1') ;
这是有效的,但我想要一个动态查询,因为我无法对post_id
值进行硬编码,因为数据类似于10,000 post_ids。
更新后的数据将如下所示
post_id|meta_key|dummy
1 url abc
1 link abc
1 key abc
1 data abc
2 url def
2 link def
2 key def
2 data def
答案 0 :(得分:0)
您可以使用CASE
UPDATE <table_name>
SET dummy = CASE post_id
WHEN 1 THEN 'abc'
WHEN 2 THEN 'def'
END
WHERE post_id IN(1,2)
由于发布了评论,我将提供示例代码如何使用此
如果在名为“value”的数组中有“post_id”和相应的“dummy”值。这是javascript代码,因为我使用的是node.js。
for(var key in values){
dummypart += ' WHEN '+values[key]['post_id']+' THEN '+values[key]['dummy'];
ids+= ','+ values[key]['post_id'];
}
我生成查询为
var query = 'UPDATE <table_name> SET dummy = CASE post_id '+dummypart+'END
WHERE post_id IN('+ids+')';
确切的查询现在是
UPDATE <table_name>
SET dummy = CASE post_id
WHEN 1 THEN 'abc'
WHEN 2 THEN 'def'
END
WHERE post_id IN(1,2)
如果值数组包含id 1和2;和相应的值。 所以在单个查询中我能够更新表中的多行。 我不知道您的确切要求。但是,既然您正在尝试生成动态查询,请尝试此操作。
答案 1 :(得分:0)
首先,我会检查每个post_id实际上只有一个值,因此您最终不会根据随机选择的几个值进行更新:
SELECT post_id, COUNT(DISTINCT dummy) dummyCount
FROM TABLE
WHERE dummy IS NOT NULL
GROUP BY post_id
HAVING COUNT(DISTINCT dummy) > 1
如果有结果,你应该检查它们。
然后,如果每个post_id确实只有一个非空虚拟值,则可以按照OP中的描述更新所有空值,如下所示:
UPDATE T
SET dummy = SRC.dummy
FROM TABLE T
JOIN
(SELECT post_id, dummy
FROM TABLE
WHERE dummy IS NOT NULL) SRC ON SRC.post_id = T.post_id
--WHERE dummy IS NOT NULL > should not be used
WHERE dummy IS NULL
答案 2 :(得分:0)