【问题标题】:How to delete from a table where ID is in a list of IDs?如何从 ID 位于 ID 列表中的表中删除?
【发布时间】:2011-02-06 14:49:54
【问题描述】:

如果我有一个 ID 列表 (1,4,6,7) 和一个 db 表,我想在其中删除 ID 在此列表中的所有记录,该怎么做?

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    您的问题几乎说明了这个问题的 SQL:

    DELETE FROM table WHERE id IN (1, 4, 6, 7)
    

    【讨论】:

    • @jayarjo:任何差异都可能可以忽略不计,而且我认为没有任何理由会更有效地进行逐一删除。
    • 这正是性能可能影响便利性的地方。例如,我已经有功能可以一一完成。但如果有提高性能的机会,我可以编写一些额外的代码,否则可能不值得。
    • 一对一几乎肯定会更慢,当然在 Oracle 或 PostgreSQL 上。将 SQL 操作分解为许多较小的操作是降低性能的好方法。
    • 我发现 In 子句中的 10,000 个项目大约需要 200 秒,但 1000 个项目需要 3 秒(或标准化比较中的 30 秒)。大小确实很重要。
    • 另外很高兴知道,如果您使用 select @SOMEVAAR := GRUP_CONCAT(id) --- IN (@SOMEVAAR) 分配变量将无法按预期工作并且没有使用索引,并且它只从字符串列表中删除第一个 id。见这个例子stackoverflow.com/questions/68237175/…
    【解决方案2】:
    delete from t
    where id in (1, 4, 6, 7)
    

    【讨论】:

      【解决方案3】:
              CREATE FUNCTION dbo.func_SplitString
              (    
                  @Input NVARCHAR(MAX),
                  @Character CHAR(1)
              )
              RETURNS @Output TABLE (
                  Item NVARCHAR(1000)
              )
              AS
              BEGIN
                  DECLARE @StartIndex INT, @EndIndex INT;
      
                  SET @StartIndex = 1;
      
                  --ADD THE SEPERATING CHARACTER AT THE END OF THE STRING FOR LOOP PURPOSE
      
                  IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
                  BEGIN
                      SET @Input = @Input + @Character;
                  END
      
                  -- LOOP AS LONG AS THE SEPARATOR EXISTS IN THE STRING
      
                  WHILE CHARINDEX(@Character, @Input) > 0
                  BEGIN
                      -- GET INDEX OF THE SEPARATOR (THIS INDICATES AN ITEM WE CAN TAKE OFF THE STRING)
      
                      SET @EndIndex = CHARINDEX(@Character, @Input);
      
                      -- INSERT ITEM INTO TEMP TABLE
      
                      INSERT INTO @Output(Item)
                      SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1);
          
                      -- REMOVE ITEM FROM ORIGINAL STRING ALONG WITH THE SEPARATOR WE HAVE JUST WORKED WITH
      
                      -- THIS REMOVES THE ITEM AFTER ADDING IT TO THE TEMP TABLE ALONG WITH THE SEPARATOR FOR THE ITEM
                      -- UNTIL THERE IS NO SEPARATOR ANYMORE IN THE ORIGINAL STRING
      
                      SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input));
                  END
      
                  RETURN
              END
              GO
      

      ========= 使用函数执行删除操作==========

           DECLARE @ListOfIDs varchar(100);
      
           SET @ListOfIDs = '100,200,300,400,500';
      
           DELETE FROM [dbo].[tableContainingDataToDelete]
           WHERE 
           ID IN(SELECT CAST(Item AS int)
           FROM dbo.func_SplitString(@ListOfIDs , ','));
      

      ========= 希望能有所帮助(微笑)========

      【讨论】:

        猜你喜欢
        • 2020-03-31
        • 2017-07-10
        • 1970-01-01
        • 1970-01-01
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多