2013-02-28 97 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

相關問題