sql-server - SQL 从 2 个不相关的表中插入一个表并且不存在
问题描述
我可以运行下一个 sql 脚本一次,使用来自 2 个不相关表的信息插入一些行:
INSERT INTO CompanyCarType (Name, CompanyId, LastModDateTime, LastModUserId)
SELECT T.Name, C.Id , GETDATE() LastModDateTime, C.LastModUserId
FROM CarType T
CROSS JOIN Company C
但是,我需要能够多次运行此脚本而不会插入重复项,或者在我的情况下失败,因为该表不允许重复CompanyId
和Name
.
所以我尝试使用WHERE NOT EXISTS
,但是由于语句中有2个表SELECT
,我不能使用别名来引用它,并且语法不正确。
INSERT INTO CompanyCarType (Name, CompanyId, LastModDateTime, LastModUserId)
SELECT T.Name, C.Id , GETDATE() LastModDateTime, C.LastModUserId
FROM CarType T
CROSS JOIN Company C) AS T1
WHERE NOT EXISTS (SELECT Name
FROM CompanyCarType T2
WHERE T2.Name = T1.Name)
有很多在 SELECT 子句中使用一个表的愚蠢示例,但没有一个使用 2 个或更多表的示例。
谢谢!
解决方案
您可以在插入时使用行号,然后在 where not exists 子句中添加公司 ID。
INSERT INTO CompanyCarType
(Name, CompanyId, LastModDateTime, LastModUserId)
SELECT T.Name, C.Id , GETDATE() LastModDateTime, C.LastModUserId, ROW_NUMBER() over (partition by t.name, c.ID order by LastModDateTime) rownum
FROM CarType T CROSS JOIN Company C) as T1
WHERE t1.rownum = 1 and NOT EXISTS(SELECT Name
FROM CompanyCarType T2
WHERE T2.Name = T1.Name and t2.CompanyId = t1.ID)
推荐阅读
- django - Celery Beat 如何计算 datetime.now() 和下一个计划的定期任务 django 之间的差异
- javascript - redux 工具包状态重置
- ffmpeg - FFMPEG 没有声音
- elasticsearch - 从 6.5.4 更新到 7.13.2 后,Kibana 服务器尚未准备好
- ios - SwiftUI:iPhone 上 3 列布局的透明导航栏
- recursion - n = 656 Nth Fibonacci Number 的错误答案使用 Dynamic Programmin
- netbeans - 在 NetBeans 12.4 中安装 J2ME 插件
- c++ - 有人可以解释一下如何为指针向量动态分配内存吗
- javascript - 从节点 js 加密准备签名/验证模块
- c# - 如何将 EF6 MapKey 实现为实际的 C# 模型