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     |
+----+-----------+

約 4,500 万レコードのテーブルがあり、基本的に、列 b でグループ化すると、列 b のすべてのインスタンスを min(列 a) の値に変更しています。

単一のクエリでこれを行う方法はありますか? 私たちはいくつか試しました。

 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' も同じ効果で使用されます。

そして他のクエリ。これは単一のクエリで可能ですか? これについて私たちは間違って考えていますか?

4

1 に答える 1

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 |
于 2013-02-28T20:39:55.987 に答える