多行相关插入 Select

Dependent Insert with Multi Row Select

我们有一个使用 SQL 服务器的 CRM 系统,并希望用电子邮件地址填充所有客户,即使该电子邮件地址为 NULL。

有一个客户 table,一个用于电子邮件地址的 table 和一个链接器 table。

我可以为所有需要新电子邮件行的客户执行 SELECT 查询:

SELECT @CompanyId = Comp_CompanyId
FROM Company
WHERE Company.Comp_CompanyId NOT IN (
  SELECT ELink_RecordID
  FROM EmailLink
)

我可以执行 INSERT 语句来为客户添加电子邮件地址:

DECLARE @EmailId int
DECLARE @ELinkId int

EXEC @ELinkId = eware_get_identity_id 'Email'
EXEC @EmailId = eware_get_identity_id 'Email'

INSERT INTO Email (
  Emai_EmailId,
  Emai_CreatedBy,
  Emai_CreatedDate,
  Emai_UpdatedBy,
  Emai_UpdatedDate,
  Emai_TimeStamp,
  Emai_EmailAddress
)
VALUES (
  @EmailId,
  1,
  GETDATE(),
  1,
  GETDATE(),
  GETDATE(),
  NULL
)
INSERT INTO EmailLink(
  ELink_LinkID,
  ELink_CreatedBy,
  ELink_CreatedDate,
  ELink_UpdatedBy,
  ELink_UpdatedDate,
  ELink_TimeStamp,
  ELink_EntityID,
  ELink_RecordID,
  ELink_Type,
  ELink_EmailId
)
VALUES(
  @ELinkId,
  1,
  GETDATE(),
  1,
  GETDATE(),
  GETDATE(),
  5,          -- Person is 13, Company is 5
  COMPANY_ID_GOES_HERE,
  'Business',
  @EmailId
)

有没有一种方法可以将这些组合成一个大的 SQL 语句,而无需使用外部工具?我可以编写一个快速 Python 程序来执行此操作,但维护此长期计划的人员 SQL 专注于此。

我得到的最远的是将 SELECT 与电子邮件的 INSERT 结合起来,但不知道如何 INSERT 链接器行:

DECLARE @CompanyId int
DECLARE @EmailId int
DECLARE @ELinkId int

EXEC @ELinkId = eware_get_identity_id 'Email'
EXEC @EmailId = eware_get_identity_id 'Email'

INSERT INTO Email (
  Emai_EmailId,
  Emai_CreatedBy,
  Emai_CreatedDate,
  Emai_UpdatedBy,
  Emai_UpdatedDate,
  Emai_TimeStamp,
  Emai_EmailAddress
)
VALUES (
  @EmailId,
  1,
  GETDATE(),
  1,
  GETDATE(),
  GETDATE(),
  NULL
)

SELECT @CompanyId = Comp_CompanyId
FROM Company
WHERE Company.Comp_CompanyId NOT IN (
  SELECT ELink_RecordID
  FROM EmailLink
)

这对第二部分有用吗?

DECLARE @CompanyId int
DECLARE @EmailId int
DECLARE @ELinkId int

EXEC @ELinkId = eware_get_identity_id 'Email'
EXEC @EmailId = eware_get_identity_id 'Email'

INSERT INTO Email (
  Emai_EmailId,
  Emai_CreatedBy,
  Emai_CreatedDate,
  Emai_UpdatedBy,
  Emai_UpdatedDate,
  Emai_TimeStamp,
  Emai_EmailAddress
)
VALUES (
  @EmailId,
  1,
  GETDATE(),
  1,
  GETDATE(),
  GETDATE(),
  NULL
)
;WITH cteX
AS(
    SELECT CompanyId = Comp_CompanyId
    FROM Company
    WHERE Company.Comp_CompanyId 
    NOT IN (
            SELECT ELink_RecordID
            FROM EmailLink 
            )
)
INSERT INTO EmailLink(
  ELink_LinkID,
  ELink_CreatedBy,
  ELink_CreatedDate,
  ELink_UpdatedBy,
  ELink_UpdatedDate,
  ELink_TimeStamp,
  ELink_EntityID,
  ELink_RecordID,
  ELink_Type,
  ELink_EmailId
)
SELECT 
    @ELinkId,
    1,
    GETDATE(),
    1,
    GETDATE(),
    GETDATE(),
    5,          -- Person is 13, Company is 5
    X.CompanyId, --COMPANY_ID_GOES_HERE,
    'Business',
    @EmailId
FROM 
    cteX X