sql - 将所有与不存在的并入并插入

标签 sql sql-server t-sql sql-server-2012

我正在尝试编写一个查询,在其中我应该验证记录是否已经存在,如果存在,则不要再次插入数据。

我写这个作为一个例子,我不知道我想要实现的目标的正确语法。请在下面找到我的尝试。

select * from
(
insert into dbo.myTable
select mt.* from #myTemp mt
union all
select * from #someTemp1
union all
select * from #someTemp2
) tb
where not exists ( select tb.* )

如果不存在,这是使用 insert into 与 union all 的正确方法吗? 我发现了一些使用 select union all where not办法 的示例,但我也希望看到一个使用 insert 的示例。

我也很好奇是否可以在不使用 merge 的情况下做到这一点。

最佳答案

您可以按照注释中的建议使用MERGE,或者只是从现有值的总和中减去

CREATE TABLE #myTable(col INT);

CREATE TABLE #myTemp(col INT);
CREATE TABLE #someTemp1(col INT);
CREATE TABLE #someTemp2(col INT);

INSERT INTO #myTable(col) VALUES (1), (2), (3);
INSERT INTO #myTemp(col) VALUES (10), (20), (30);
INSERT INTO #someTemp1(col) VALUES (1), (2), (3);
INSERT INTO #someTemp2(col) VALUES (11), (2), (31);

INSERT INTO #myTable(col)
(
  SELECT mt.col FROM #myTemp mt
  UNION ALL
  SELECT col FROM #someTemp1
  UNION ALL
  SELECT col FROM #someTemp2
)
EXCEPT
SELECT col FROM #myTable;


SELECT *
FROM #myTable;

LiveDemo

关于sql - 将所有与不存在的并入并插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33214983/

相关文章:

sql - 从具有 XML 数据类型的表中查询 XML 数据

t-sql - 在这种情况下为什么使用 TIMESTAMP 而不是 DATETIME?

sql-server - 存储过程的输出参数

t-sql - SQL 给我发送同一个文件的所有人的名字

sql-server - 重命名列 : Incorrect syntax near 'SP_RENAME' . ?

sql - 恢复数据库SQL Server查询

c# - 使用(SqlConnection)、作用域和连接池

c# - 使用 ADO.NET 传递表值参数

sql-server - SSIS完全忽略Excel列

mysql - SQL 仅选择列上具有最大值的行