現在の状況は、テーブル内の 400 百行のデータに対してフィールドにA01
、B03
、Z11
およびの値をX21
繰り返し追加することです。code
BabyCode
上記は現在の表です - 「コード」列に値はありません
上記はテーブルを更新する予定です - 反復値が「コード」列に追加されます
あなたはこれを行うことができます:
INSERT INTO BabyCode
SELECT Codes.Code
FROM
(
SELECT id
FROM
(
SELECT t3.digit * 100 + t2.digit * 10 + t1.digit + 1 AS id
FROM TEMP AS t1
CROSS JOIN TEMP AS t2
CROSS JOIN TEMP AS t3
) t
WHERE id <= 400
) t,
(
SELECT 1 AS ID, 'A01' AS Code
UNION ALL
SELECT 2, 'B03'
UNION ALL
SELECT 3, 'Z11'
UNION ALL
SELECT 4, 'X21'
) codes;
ただし、アンカーテーブルとして使用するには、一時テーブルを定義する必要があります。
CREATE TABLE TEMP (Digit int);
INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
これにより、400百行の値、、、、A01
およびがテーブルの列に挿入されます。B03
Z11
X21
code
BabyCode
@Mahmoud Gamal の回答で使用されているものと同じ仮想テーブルに 4 つの値を入れることができます。また、テーブルの ID 値が 1 から始まり、連続している (ギャップも重複もない) 場合は、次の方法を使用して仮想テーブルに結合し、ターゲットのCode
列を更新します。
UPDATE YourTable t
INNER JOIN (
SELECT 1 AS ID, 'A01' AS Code
UNION ALL SELECT 2, 'B03'
UNION ALL SELECT 3, 'Z11'
UNION ALL SELECT 4, 'X21'
) x
ON (t.ID - 1) MOD 4 + 1 = x.ID
SET t.Code = x.Code
;
それ以外の場合は、変数を使用して、、、、をテーブルのすべての行に順番に割り当てると1
、2
それらの値を使用して仮想テーブルに参加できます。3
4
UPDATE YourTable t
INNER JOIN (
SELECT ID, @rnk := CASE WHEN @rnk = 4 THEN 0 ELSE @rnk END + 1 AS rnk
FROM YourTable
CROSS JOIN (SELECT @rnk := 0) x
ORDER BY ID
) r ON t.ID = r.ID
INNER JOIN (
SELECT 1 AS ID, 'A01' AS Code
UNION ALL SELECT 2, 'B03'
UNION ALL SELECT 3, 'Z11'
UNION ALL SELECT 4, 'X21'
) x
ON r.rnk = x.ID
SET t.Code = x.Code
;
両方のクエリは、SQL Fiddle で再生できます。