1

目前的情况是在表中的 400 百行数据中以重复的方式在字段中添加低于A01,B03和的值。Z11X21codeBabyCode

当前表 - '代码中没有值

以上是当前表格 - “代码”列中没有值

待更新表 - 在“代码”列中添加重复值

以上是要更新的表格 - 在“代码”列中添加重复值

4

2 回答 2

1

你可以这样做:

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);

SQL 小提琴演示

这会将 40000 行的值A01, B03,Z11X21, 插入到code表的列中BabyCode

于 2013-01-10T08:41:11.990 回答
0

您可以将这四个值放入与@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 中使用:

于 2013-01-14T06:18:39.460 回答