2013-02-28 52 views
2

假设下表:在同一个表中更新多行有记录的第一个实例

+----+-----------+ 
| id | session | 
+----+-----------+ 
| 1 | abcd1234 | 
| 2 | abcd1234 | 
| 3 | abcd1234 | 
| 4 | qwert5678 | 
| 5 | qwert5678 | 
| 6 | abcd1234 | 
| 7 | abcd1234 | 
| 8 | qwert5678 | 
| 9 | abcd1234 | 
| 10 | qwert5678 | 
| 11 | qwert5678 | 
| 12 | qwert5678 | 
+----+-----------+ 

假设我们希望得到一个给定的会话的第一个ID,则该会话的每个实例设置为ID 为所有会议,使得表变为:

+----+-----------+ 
| id | session | 
+----+-----------+ 
| 1 |  1  | 
| 2 |  1  | 
| 3 |  1  | 
| 4 |  4  | 
| 5 |  4  | 
| 6 |  1  | 
| 7 |  1  | 
| 8 |  4  | 
| 9 |  1  | 
| 10 |  4  | 
| 11 |  4  | 
| 12 |  4  | 
+----+-----------+ 

我们有大约45M记录表,基本上改变柱的每个实例b,以最小的值(列)当b列分组。

有没有办法在单个查询中做到这一点?我们尝试了几次。

update example e 
set session = 
    (select id from 
     (select id,min(session) 
      from example as first_id 
      group by session 
     ) as this_id 
); 

......哪个出错:“子查询返回多于一行”。

update example e 
join 
    (select id 
     from 
      (select id,min(session) 
      from example as first_id 
      group by session 
     ) as this_id 
    ) as etable 
set session = first_id; 

......哪个出错:“字段列表”中的未知列'first_id'。也使用'this_id'来达到同样的效果。

等查询。这可能在一个单一的查询?我们是否错误地考虑了这个问题?

+0

你们是不是要更新您从中选择值相同的表?这恐怕是不允许的。 – 2013-02-28 20:30:49

+0

为管理目的,你可以创建一个列,你可以添加最小会话ID在插入后,选择MIN会话ID后 – 2013-02-28 20:35:51

回答

2

查询:

SQLFIDDLEExample

UPDATE example 
SET session =(SELECT MIN(e2.ID) 
       FROM (SELECT * 
        FROM example) e2 
       WHERE e2.session = example.session) 

结果:

| ID | SESSION | 
---------------- 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  4 | 
| 5 |  4 | 
| 6 |  1 | 
| 7 |  1 | 
| 8 |  4 | 
| 9 |  1 | 
| 10 |  4 | 
| 11 |  4 | 
| 12 |  4 | 
+0

唉,我很接近!非常感谢,贾斯汀。 – cynesis 2013-02-28 20:55:53

相关问题