【发布时间】:2019-11-25 20:33:45
【问题描述】:
[注意:我找到了一些答案,例如9911659和16636698,但它们的语法不够清楚。]
我想在表中插入一行,但前提是该行不存在。插入行的列值来自变量(过程参数)而不是另一个表,所以我不会使用merge。
我不想使用单独的 if exists 后跟 insert,而是希望在单个 (insert) 语句中完成此操作。
我有@bookID、@userID、@reviewDate 和@reviewYear 作为我的proc 的参数,我想将它们插入到表my_table 的新行中。
所以我有这个:
insert into my_table
(bookID, reviewYear, userID, reviewDate)
select
@bookID, @reviewYear, @userID, @reviewDate -- Proc arguments, values for new row
from my_table
where not exists (
select bookID -- Find existing matching row
from my_table
where bookID = @bookID
and reviewYear = @reviewYear
)
换句话说,insert 仅在不存在具有相同bookID 和reviewYear 的现有行时才会添加新行。因此,给定用户可以为给定年份的给定图书添加评论,但前提是没有用户这样做。
我的理解是否正确,或者是否有更简单的语法来完成相同的事情(在单个语句中)?
附录(2020 年 1 月 10 日)
正如所指出的,select 将选择多行,整个insert 语句最终将插入许多行,可能与my_table 中的当前行一样多。
第二次尝试,将distinct 子句添加到select:
insert into my_table
(bookID, reviewYear, userID, reviewDate)
select distinct -- Only one possible match
@bookID, @reviewYear, @userID, @reviewDate -- Proc arguments, values for new row
from my_table
where not exists (
select bookID -- Find existing matching row
from my_table
where bookID = @bookID
and reviewYear = @reviewYear
)
【问题讨论】:
-
那是一条语句?是的,这是正确的。您当然可以添加唯一约束以强制不添加重复项。但仍然会像你一样写你的插入。
-
我不明白你的目标。是什么让一种语法比另一种更“简单”,你为什么想要它?少打字?你已经完成了打字,那么你在追求什么,为什么?
-
@TabAlleman - “更简单”是指“不那么复杂”和“更少的计算开销”。对于这个特定问题,我想问是否有更简单的方法来做同样的事情,但使用更简单的子查询或根本没有子查询。
标签: sql sql-server