目前的情况是在字段A01
中以重复的方式为{400}数据行添加B03
,Z11
,X21
和code
以下的值在表BabyCode
中。
以上是当前表 - “代码”列中没有值
以上是要更新的表格 - 在“代码”列中添加重复值
答案 0 :(得分: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);
这会将值A01
,B03
,Z11
和X21
的400个行插入表{code
列中1}}。
答案 1 :(得分: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中播放: