SQL 服务器合并:如果源 table 中的两列不相等,则将它们作为新记录插入目标 table 的一列中
SQL Server merge: If two columns in source table are not equal then insert them as new records in one column of target table
我一直在努力解决一个问题,我需要比较源 table 中的两列,如果不相等,则将它们作为新行合并到第三个 table 中。如果它们相等,则将它们作为一条记录插入,示例如下:
来源Table:
MIN_ID MAX_ID
1 1+
4 2
3 3
3 1
4 1+
期望的目标Table:
MERGED_ID
1
1+
4
2
3
3
1
4
1+
我尝试使用合并插入匹配值和一个不匹配值,将相同数量的记录插入目标(Source.MIN_ID 或 Source.MAX_ID)
MERGE into [dbo].[Target] as A
USING
[dbo].[Source] as B
ON
(B.MIN_ID=B.MAX_ID)
WHEN MATCHED THEN
UPDATE SET A.MERGED_ID=B.MAX_ID
WHEN NOT MATCHED THEN
INSERT
(A.MERGED_ID)
VALUES
(B.MIN_ID)
)
;
GO
这向目标中插入了 190 万条与源相同的记录(如果相等则 MAX_ID 否则 MIN_ID)。
但是我仍然需要将 Source.MAX_ID 值插入到这个 table 中,如果不等于 Source.MIN_ID 所以我写了另一个类似的合并,它作为一个无休止的查询运行(55 分钟直到我终止查询,目标table 已经有 190 万行。第一次合并用了 13 秒)
MERGE into [dbo].[Target] as A
USING
[dbo].[Source] as B
ON
(A.MERGED_ID=B.MAX_ID)
WHEN MATCHED THEN
UPDATE SET A.MERGED_ID=B.MAX_ID
WHEN NOT MATCHED THEN
INSERT
(A.MERGED_ID)
VALUES
(B.MAX_ID)
)
;
GO
有人可以告诉我做错了什么吗?
通过让事情变得更简单来解决我的问题。第一个查询修改如下
MERGE into [dbo].[Target] as A
USING
[dbo].[Source] as B
ON
(B.MAX_ID=A.MERGED_ID)
WHEN MATCHED THEN
UPDATE SET A.MERGED_ID=B.MAX_ID
WHEN NOT MATCHED THEN
INSERT
(A.MERGED_ID)
VALUES
(B.MIN_ID)
;
GO
然后我使用一个简单的 INSERT INTO SELECT STATEMENT 来填充其他需要的值
INSERT INTO dbo.Target
(MERGED_ID)
SELECT B.MAX_ID
FROM dbo.Source as B
WHERE B.MIN_ID<>B.MAX_ID;
导致 190 万条原始记录加上 45 万条额外记录,其中源 table 中的两列不相等
我一直在努力解决一个问题,我需要比较源 table 中的两列,如果不相等,则将它们作为新行合并到第三个 table 中。如果它们相等,则将它们作为一条记录插入,示例如下:
来源Table:
MIN_ID MAX_ID
1 1+
4 2
3 3
3 1
4 1+
期望的目标Table:
MERGED_ID
1
1+
4
2
3
3
1
4
1+
我尝试使用合并插入匹配值和一个不匹配值,将相同数量的记录插入目标(Source.MIN_ID 或 Source.MAX_ID)
MERGE into [dbo].[Target] as A
USING
[dbo].[Source] as B
ON
(B.MIN_ID=B.MAX_ID)
WHEN MATCHED THEN
UPDATE SET A.MERGED_ID=B.MAX_ID
WHEN NOT MATCHED THEN
INSERT
(A.MERGED_ID)
VALUES
(B.MIN_ID)
)
;
GO
这向目标中插入了 190 万条与源相同的记录(如果相等则 MAX_ID 否则 MIN_ID)。 但是我仍然需要将 Source.MAX_ID 值插入到这个 table 中,如果不等于 Source.MIN_ID 所以我写了另一个类似的合并,它作为一个无休止的查询运行(55 分钟直到我终止查询,目标table 已经有 190 万行。第一次合并用了 13 秒)
MERGE into [dbo].[Target] as A
USING
[dbo].[Source] as B
ON
(A.MERGED_ID=B.MAX_ID)
WHEN MATCHED THEN
UPDATE SET A.MERGED_ID=B.MAX_ID
WHEN NOT MATCHED THEN
INSERT
(A.MERGED_ID)
VALUES
(B.MAX_ID)
)
;
GO
有人可以告诉我做错了什么吗?
通过让事情变得更简单来解决我的问题。第一个查询修改如下
MERGE into [dbo].[Target] as A
USING
[dbo].[Source] as B
ON
(B.MAX_ID=A.MERGED_ID)
WHEN MATCHED THEN
UPDATE SET A.MERGED_ID=B.MAX_ID
WHEN NOT MATCHED THEN
INSERT
(A.MERGED_ID)
VALUES
(B.MIN_ID)
;
GO
然后我使用一个简单的 INSERT INTO SELECT STATEMENT 来填充其他需要的值
INSERT INTO dbo.Target
(MERGED_ID)
SELECT B.MAX_ID
FROM dbo.Source as B
WHERE B.MIN_ID<>B.MAX_ID;
导致 190 万条原始记录加上 45 万条额外记录,其中源 table 中的两列不相等