目前的情况是在表中的 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);
这会将 40000 行的值A01
, B03
,Z11
和X21
, 插入到code
表的列中BabyCode
。
您可以将这四个值放入与@Mahmoud Gamal 的答案中使用的相同的虚拟表中,并且,如果表中的 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 中使用: