插入多行,但对于每一行检查它是否尚不存在

Ger*_*son 1 sql sql-server sql-insert

EXIST如果目标表中没有多行,我希望插入多行。但我不确定如何使用以下代码执行此操作:

INSERT INTO sales.promotions(
    promotion_name,
    discount,
    start_date,
    expired_date
)
VALUES
('2019 Summer Promotion', 0.15, '20190601', '20190901'),
('2019 Fall Promotion',   0.20, '20191001', '20191101'),
('2019 Winter Promotion', 0.25, '20191201', '20200101');
Run Code Online (Sandbox Code Playgroud)

因为该WHERE NOT EXIST子句将应用于所有行,而我需要逐行执行:

WHERE NOT EXISTS (SELECT * FROM sales.promotions
    WHERE promotion_name = 'Winter Promotion');
Run Code Online (Sandbox Code Playgroud)

抱歉,如果这是非常明显的,我不太擅长 SQL,而且我不太确定如何表达这个问题以进行适当的研究。

Sal*_*n A 5

可以使用表值构造函数exists

INSERT INTO sales.promotions(promotion_name, discount, start_date, expired_date)
SELECT *
FROM (VALUES
    ('2019 Summer Promotion', 0.15, '20190601', '20190901'),
    ('2019 Fall Promotion',   0.20, '20191001', '20191101'),
    ('2019 Winter Promotion', 0.25, '20191201', '20200101')
) AS values_tobe_inserted(promotion_name, discount, start_date, expired_date)
WHERE NOT EXISTS (
    SELECT *
    FROM sales.promotions
    WHERE sales.promotions.promotion_name = values_tobe_inserted.promotion_name
)
Run Code Online (Sandbox Code Playgroud)