【问题标题】:Delete from MS SQL using Split使用拆分从 MS SQL 中删除
【发布时间】:2018-05-24 12:09:03
【问题描述】:

我正在使用

       INSERT INTO [dbo].[ADMIN_Publications_email]
       ([email]
       ,[pmid]
       )
      SELECT @email, CAST(Item AS NVARCHAR(10)) 
     FROM  dbo.Split(@PMID_List, ',')  

Split 是一个非常标准的分割字符串的函数。插入工作正常,但如果已添加记录,我需要一种删除记录的方法。这样,如果它一遍又一遍地完成相同的过程,我就不会得到一大堆重复的记录。如何根据电子邮件地址和 PMID_list 中的值删除。我不能全部删除,因为它们可以以不同的方式添加。我需要类似的东西

     DELETE FROM [dbo].[ADMIN_Publications_email]
WHERE (email = @Email) AND IN dbo.Split(@PMID_LIST)

拆分在where子句中的位置。

【问题讨论】:

  • 您也可以考虑通过在您的INSERT 查询中添加WHERE NOT EXISTS 来跳过已经插入的数据,而不是预先删除所有内容。 (当然,这只有在您知道数据稳定时才有效。)
  • 你伤了我的心。我以为你会规范化你的数据:stackoverflow.com/questions/50498610/…

标签: sql sql-server stored-procedures sql-server-2016


【解决方案1】:

你可以用这个。

DELETE FROM [dbo].[ADMIN_Publications_email]
WHERE (email = @Email) AND [pmid] IN (SELECT CAST(Item AS NVARCHAR(10)) FROM dbo.Split(@PMID_LIST))

【讨论】:

  • 我想知道这与下面列出的 NOT EXISTS 方法相比效率如何?我倾向于像这样删除它们。
  • 我刚刚修复了删除查询。没有尝试很难说最好的方法,但是您正在与静态值进行比较并且使用 IN 会更好。 EXISTS 更适用于表格。而不是插入后删除,我建议不要插入它们。
【解决方案2】:

我不建议插入和删除。只需使用

 INSERT INTO [dbo].[ADMIN_Publications_email]
       ([email]
       ,[pmid]
       )
      SELECT @email, CAST(Item AS NVARCHAR(10)) 
     FROM  dbo.Split(@PMID_List, ',')  
     WHERE NOT EXISTS 
     (
        select 1 from [dbo].[ADMIN_Publications_email] where [email]=@email and [pmid]=CAST(Item AS NVARCHAR(10)) 
     )

【讨论】:

    【解决方案3】:
    DELETE FROM [dbo].[ADMIN_Publications_email] WHERE pmid IN (SELECT Item FROM  @PMID_LIST) OR email = @Email
    

    【讨论】:

    • 请添加更好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多