如何将 temp_tbl 中的唯一值附加到 original_tbl (SQL Server) 中?
Posted
技术标签:
【中文标题】如何将 temp_tbl 中的唯一值附加到 original_tbl (SQL Server) 中?【英文标题】:How to append unique values from temp_tbl into original_tbl (SQL Server)? 【发布时间】:2022-01-20 13:27:07 【问题描述】:我有一个表,我正在尝试向其附加唯一值。每个月我都会获得要导入此表的用户登录列表。我想保留所有原始值,并将新的唯一值附加到现有表中。 表格和平面文件都有一个具有唯一值的列,构建如下:
_____
login
abcde001
abcde002
...
_____
我正在将平面文件批量提取到临时表中,其中:
IF OBJECT_ID('tempdb..#FLAT_FILE_TBL') IS NOT NULL
DROP TABLE #FLAT_FILE_TBL
CREATE TABLE #FLAT_FILE_TBL
(
ntlogin2 nvarchar(15)
)
BULK INSERT #FLAT_FILE_TBL
FROM 'C:\ImportFiles\logins_Dec2021.csv'
WITH (FIELDTERMINATOR = ' ');
是否有一个联接可以为我提供带有现有值 + 附加新唯一值的表?我宁愿不硬编码一个循环来逐行评估它。
类似(伪代码):
append unique login from temp_tbl into original_tbl
希望这对外面的人来说是一个简单的答案。
谢谢!
【问题讨论】:
你试过INSERT INTO FinalTable (...) SELECT ... FROM #ThatTempTable
吗?
@PanagiotisKanavos: ...EXCEPT SELECT ntlogin2 FROM FinalTable
。 (WHERE NOT IN
也可以,但EXCEPT
也会删除重复数据。)
【参考方案1】:
Reddit r/sql 上的海报提供了这个答案,我正在追求:
合并语句?
看起来使用合并语句将完全符合我的要求。感谢那些已经发布回复的人。
【讨论】:
你还没有解释你想要什么。您只谈到了插入,而不是忽略重复项。这也很容易,如果您对目标使用 NOT EXISTS 或 LEFT JOIN 来查看行是否已经存在。不,MERGE 有太多错误。检查Use Caution with SQL Server's MERGE - 有多少错误。【参考方案2】:您可以使用'EXISTS'子句检查记录是否存在,如果目标表中不存在则插入。您也可以使用 MERGE 语句来实现相同的目的。根据您要对目标表中的现有记录执行的操作,您可以修改 Merge 语句。这里因为你只想插入新记录,所以你只需要指定当有新记录进来时你想要做什么。这里是一个例子
MERGE original_tbl T
USING temp_tbl S
ON T.login = S.login
WHEN NOT MATCHED THEN
INSERT (login)
VALUES(S.login)
另一种解决方案是将目标表左连接到临时表并仅在记录不存在时插入。
INSERT INTO original_tbl(login)
SELECT S.Login
FROM temp_tbl S
LEFT JOIN original_tbl T
ON S.Login = T.Login
WHERE T.Login IS NULL
【讨论】:
是的,这是完美的,谢谢。我还没有足够的声誉来支持您的回复 这里为什么是MERGE
?在我看来,INSERT
和 JOIN
、NOT IN
或 NOT EXISTS
会是更好的选择。
这里没有理由使用 MERGE,还有很多缺点。 MERGE 太麻烦了。带有 JOIN、NOT IN 或 NOT EXISTS 的 INSERT 会更好地工作,并且需要 更少 行
检查Use Caution with SQL Server's MERGE - 有多少错误。以上是关于如何将 temp_tbl 中的唯一值附加到 original_tbl (SQL Server) 中?的主要内容,如果未能解决你的问题,请参考以下文章
将唯一 id 附加到 simple_form 生成的单选按钮输入,并将匹配值附加到关联标签
将浮点数组写入和附加到 C++ 中 hdf5 文件中的唯一数据集