【发布时间】:2021-08-30 15:58:01
【问题描述】:
嘿,
我是 SQL 新手,如果这个问题太基础,我深表歉意。
我有以下表格和 SCD 类型 1 逻辑的解决方案。
-- 源表
CREATE TABLE table_source (
recipe_id INT NOT NULL,
recipe_name VARCHAR(30) NOT NULL,
HashValue VARCHAR(30) NOT NULL)
INSERT INTO table_source
(recipe_id, recipe_name, HashValue)
VALUES
(1,'Tacos','1039479aa20'),
(2,'TomatoSoup','1039479aa21'),
(3,'GrilledCheese', '1039479aa22')
--目标表
CREATE TABLE table_target (
recipe_id INT NOT NULL,
recipe_name VARCHAR(30) NOT NULL,
HashValue VARCHAR(30) NOT NULL)
INSERT INTO table_target
(recipe_id, recipe_name, HashValue)
VALUES
(1,'Tacos','1039479aa20'),
(2,'TomatoSoup','1039479aa21'),
(3,'GrilledCheese', '1039479aa22'),
(4,'BakedCheese', '1039479aa23')
--TYPE 1 渐变维度
MERGE INTO table_target AS TARGET
USING (
SELECT recipe_id,
recipe_name,
HashValue
FROM fram_source
) AS SOURCE
ON SOURCE.recipe_id = TARGET.recipe_id
WHEN MATCHED
AND (ISNULL(TARGET.HashValue, '') <> ISNULL(SOURCE.HashValue, ''))
THEN
UPDATE
SET
TARGET.recipe_id = SOURCE.recipe_id
,TARGET.recipe_name = SOURCE.recipe_name,
TARGET.[HashValue] = SOURCE.[HashValue]
WHEN NOT MATCHED
THEN
INSERT (recipe_id,
recipe_name,
HashValue
)
VALUES (
SOURCE.recipe_id
,SOURCE. recipe_name
, SOURCE.[HashValue]
)
OUTPUT
$action,
inserted.*,
deleted.*
;
我希望我的目标表与我的源表相同,但此脚本不会删除目标表中的额外值。 我的问题是,如何使这个脚本删除目标表中不在源表中的值?
【问题讨论】:
-
嗯?你不想删除任何不存在的东西吗?
DELETE FROM target_table WHERE NOT EXISTS (SELECT ... FROM target_table WHERE x = source_table.x...); -
谢谢,是的。我测试了它并且它有效,但我需要将此功能添加到我的脚本中,所以我找到了解决方案。感谢您的帮助!