我有一个预订表(table_b),大约有1.3M行。第二个表(table_s)用于说明何时需要单独的应用程序访问这些行。
目前有触发器在table_s中创建记录,但这对所有现有数据没有帮助。
我相信我需要一个查询来选择table_b中存在但不存在table_s的行,然后为每一行插入一行。
这是我目前的语法,但不认为它已经正确形成
DECLARE @b_id [INT] = 0;
WHILE(1 = 1)
BEGIN
SELECT TOP 10
@b_id = MIN([b].[b_id])
FROM
[table_b] AS [b]
LEFT JOIN
[table_s] AS [s] ON [b].[b_id] = [s].[b_id]
WHERE
[s].[b_id] IS NULL;
IF @b_id IS NULL
BREAK;
INSERT INTO [table_s] ([b_id], [processed])
VALUES (@b_id, 0);
END;
答案 0 :(得分:1)
语法上一切都很好。但是你的查询中存在一些误解
select top 10 @b_id = MIN(b.b_id)
变量只能包含一个值,即使您选择top 10
它也会将单个值赋给变量。您当前的方法将循环每个非现有记录
我认为没有100万条记录插入我们需要将插入分成批次。试试这种方式
INSERT INTO table_s
(b_id,
processed)
SELECT b_id,
0
FROM table_b AS b
WHERE NOT EXISTS (SELECT 1
FROM table_s AS s
WHERE b.b_id = s.b_id)