更新SQL查询

时间:2013-11-20 09:13:16

标签: mysql sql sql-server

我正在写一个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

3 个答案:

答案 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)

update Table_Name 
set dummy = Case when post_id='1' then 'abc'
                 when post_id='2' then 'def'
end
where post_id in('1','2')

enter image description here