回答編集履歴

5 コード修正

Panzer_vor

Panzer_vor score 1632

2016/08/05 04:36  投稿

アルファベット置き換え用テーブルを追加して・・・
```SQL
CREATE TABLE LETTERS(
  SEQNO INTEGER(3)   -- 連番
, LETTER VARCHAR(1)  -- アルファベット
)
```
連番には0~25にa~zを設定し、
SEQNO LETTER
0        a
1        b
** -- 中略 -- **
25      z
PostgreSQLで以下の感じのクエリを書くと実現出来そうなんですが・・・
** ※クエリが盛大に間違ってたので修正 **
```SQL
UPDATE table
UPDATE table
SET
   ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
FROM
   (
       SELECT
           T3.*
           T2.*
       ,  T3.LETTER
       FROM
           (
               SELECT
                   T1.MIN_ID
                   , T1.UPD_KEY
                   , T2.LETTER
                   , T1.UPD_KEY
                   , ROW_NUMBER() OVER (ORDER BY MIN_ID) - 1 AS ROW_NUM
               FROM
                   (
                       SELECT
                           MIN(ID1) AS MIN_ID
                           , ID2 AS UPD_KEY
                           , ROW_NUMBER() OVER (ORDER BY ID2) - 1 AS ROW_NUM
                           , ID2 AS UPD_KEY
                       FROM
                           table
                           table
                       GROUP BY
                           ID2
                       ORDER BY
                           MIN_ID
                   ) T1
                   INNER JOIN LETTERS T2
                       ON MOD(T1.ROW_NUM, 25) = T2.SEQNO
           ) T3
                   ) T1
           ) T2
           INNER JOIN LETTERS T3
               ON MOD(T2.ROW_NUM, 25) = T3.SEQNO
   ) T4
WHERE
   ID2 = T4.UPD_KEY
```
これをMySQL風に書き直そうと思いましたが力尽きました・・・
(MySQLはROW_NUMBER分析関数はサポートしてないのね・・・orz)
**・追記**
MOD(T1.ROW_NUM, 25)と文字列変換テーブルの連番で結合かけてるので、
zまで採番が終わるとaから循環し直す仕様にしてます。
4 コード修正

Panzer_vor

Panzer_vor score 1632

2016/08/05 04:08  投稿

アルファベット置き換え用テーブルを追加して・・・
```SQL
CREATE TABLE LETTERS(
  SEQNO INTEGER(3)   -- 連番
, LETTER VARCHAR(1)  -- アルファベット
)
```
連番には0~25にa~zを設定し、
SEQNO LETTER
0        a
1        b
** -- 中略 -- **
25      z
PostgreSQLで以下の感じのクエリを書くと実現出来そうなんですが・・・
```SQL
UPDATE table
SET
   ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
FROM
   (
       SELECT
           T3.*
       FROM
           (
               SELECT
                   T1.MIN_ID
                   , T1.ID2 AS UPD_KEY
                   , T1.UPD_KEY
                   , T2.LETTER
               FROM
                   (
                       SELECT
                           MIN(ID1) MIN_ID
                           , ID2
                           MIN(ID1) AS MIN_ID
                           , ID2 AS UPD_KEY
                           , ROW_NUMBER() OVER (ORDER BY ID2) - 1 AS ROW_NUM
                       FROM
                           table
                       GROUP BY
                           ID2
                       ORDER BY
                           MIN_ID
                   ) T1
                   INNER JOIN LETTERS T2
                       ON MOD(T1.ROW_NUM, 25) = T2.SEQNO
           ) T3
   ) T4
WHERE
   ID2 = T4.UPD_KEY
```
これをMySQL風に書き直そうと思いましたが力尽きました・・・
(MySQLはROW_NUMBER分析関数はサポートしてないのね・・・orz)
**・追記**
MOD(T1.ROW_NUM, 25)と文字列変換テーブルの連番で結合かけてるので、
zまで採番が終わるとaから循環し直す仕様にしてます。
3 誤字修正

Panzer_vor

Panzer_vor score 1632

2016/08/05 04:01  投稿

アルファベット置き換え用テーブルを追加して・・・
```SQL
CREATE TABLE LETTERS(
  SEQNO INTEGER(3)   -- 連番
, LETTER VARCHAR(1)  -- アルファベット
)
```
連番には0~25にa~zを設定し、
SEQNO LETTER
0        a
1        b
** -- 中略 -- **
25      z
PostgreSQLで以下の感じのクエリを書くと実現出来そうなんですが・・・
```SQL
UPDATE table
SET
   ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
FROM
   (
       SELECT
           T3.*
       FROM
           (
               SELECT
                   T1.MIN_ID
                   , T1.ID2 AS UPD_KEY
                   , T2.LETTER
               FROM
                   (
                       SELECT
                           MIN(ID1) MIN_ID
                           , ID2
                           , ROW_NUMBER() OVER (ORDER BY ID2) - 1 AS ROW_NUM
                       FROM
                           table
                       GROUP BY
                           ID2
                       ORDER BY
                           MIN_ID
                   ) T1
                   INNER JOIN LETTERS T2
                       ON MOD(T1.ROW_NUM, 25) = T2.SEQNO
           ) T3
   ) T4
WHERE
   ID2 = T4.UPD_KEY
```
これをMySQL風に書き直そうと思いましたが力尽きました・・・
(MySQLはROW_NUMBER分析関数はサポートしてないのね・・・orz)
**・追記**
MOD(MOD(T1.ROW_NUM, 25))と文字列変換テーブルの連番で結合かけてるので、
MOD(T1.ROW_NUM, 25)と文字列変換テーブルの連番で結合かけてるので、
zまで採番が終わるとaから循環し直す仕様にしてます。
2 コード変更

Panzer_vor

Panzer_vor score 1632

2016/08/05 03:52  投稿

アルファベット置き換え用テーブルを追加して・・・
```SQL
CREATE TABLE LETTERS(
  SEQNO INTEGER(3)   -- 連番
, LETTER VARCHAR(1)  -- アルファベット
)
```
連番には0~25にa~zを設定し、
SEQNO LETTER
0        a
1        b
** -- 中略 -- **
25      z
PostgreSQLで以下の感じのクエリを書くと実現出来そうなんですが・・・
```SQL
UPDATE table
SET
   ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
FROM
   (
       SELECT
           T3.*
       FROM
           (
               SELECT
                   T1.MIN_ID
                   , T1.ID2 AS UPD_KEY
                   , T2.LETTER
               FROM
                   (
                       SELECT
                           MIN(ID1) MIN_ID
                           , ID2
                           , row_number() OVER (ORDER BY ID2) - 1 AS ROW_NUM
                           , ROW_NUMBER() OVER (ORDER BY ID2) - 1 AS ROW_NUM
                       FROM
                           table
                       GROUP BY
                           ID2
                       ORDER BY
                           MIN_ID
                   ) T1
                   INNER JOIN LETTERS T2
                       ON MOD(T1.ROW_NUM, 25) = T2.SEQNO
           ) T3
   ) T4
WHERE
   ID2 = T4.UPD_KEY
```
これをMySQL風に書き直そうと思いましたが力尽きました・・・
(MySQLはROW_NUMBER分析関数はサポートしてないのね・・・orz)
**・追記**
MOD(MOD(T1.ROW_NUM, 25))と文字列変換テーブルの連番で結合かけてるので、
zまで採番が終わるとaから循環し直す仕様にしてます。
1 追記

Panzer_vor

Panzer_vor score 1632

2016/08/05 03:50  投稿

アルファベット置き換え用テーブルを追加して・・・
```SQL
CREATE TABLE LETTERS(
  SEQNO INTEGER(3)   -- 連番
, LETTER VARCHAR(1)  -- アルファベット
)
```
連番には0~25にa~zを設定し、
SEQNO LETTER
0        a
1        b
** -- 中略 -- **
25      z
PostgreSQLで以下の感じのクエリを書くと実現出来そうなんですが・・・
```SQL
UPDATE table
SET
   ID1 = CONCAT(SUBSTR(ID1, 1, 1), T4.LETTER, SUBSTR(ID1, 3))
FROM
   (
       SELECT
           T3.*
       FROM
           (
               SELECT
                   T1.MIN_ID
                   , T1.ID2 AS UPD_KEY
                   , T2.LETTER
               FROM
                   (
                       SELECT
                           MIN(ID1) MIN_ID
                           , ID2
                           , row_number() OVER (ORDER BY ID2) - 1 AS ROW_NUM
                       FROM
                           table
                       GROUP BY
                           ID2
                       ORDER BY
                           MIN_ID
                   ) T1
                   INNER JOIN LETTERS T2
                       ON mod(T1.ROW_NUM, 25) = T2.SEQNO
                       ON MOD(T1.ROW_NUM, 25) = T2.SEQNO
           ) T3
   ) T4
WHERE
   ID2 = T4.UPD_KEY
```
これをMySQL風に書き直そうと思いましたが力尽きました・・・
(MySQLはROW_NUMBER分析関数はサポートしてないのね・・・orz)
(MySQLはROW_NUMBER分析関数はサポートしてないのね・・・orz)
**・追記**
MOD(MOD(T1.ROW_NUM, 25))と文字列変換テーブルの連番で結合かけてるので、
zまで採番が終わるとaから循環し直す仕様にしてます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る