【问题标题】:Delete non-matching data from table从表中删除不匹配的数据
【发布时间】:2016-08-12 12:56:43
【问题描述】:

我有一张桌子和同一张桌子的备份。备份后在主表中插入了一些数据。现在我想从主表中删除数据。如何实现? 假设表是“BookMap”,列 AuthorID、BookName、BookID。备份“BookMap”表并插入新数据。现在想删除这些数据。

注意:我这里没有主键。

【问题讨论】:

  • 编辑您的问题并提供示例数据和所需的结果。
  • 您可以使用 MERGE 和 WHEN MATCHED DELETE;在这里查看:technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx
  • @scsimon: 合并语句需要主键
  • 删除哪些数据?您希望这些表看起来如何?顺便说一句,为什么没有主键?
  • @SandipPatel 如果您检查所有列,则不会。

标签: sql sql-server join


【解决方案1】:

如果您希望 BookMap 看起来像 backup_BookMap,那么您可以考虑:

truncate table bookmap;

insert into bookmap( . . .)
   select . . .
   from backup_bookmap;

【讨论】:

    【解决方案2】:

    如果我对您的理解正确,您想从 non-backup 表中删除已插入 backup 表的数据:

    DELETE nonbackup
    FROM BookMap as nonbackup
    WHERE nonbackup.BookID IN
    (
        SELECT BookID
        FROM BookMapBackup as backup
    )
    

    【讨论】:

    • 我认为你的逻辑不正确。我无法删除仅以 BookID 作为过滤器的数据:(
    【解决方案3】:

    试试这样,

    DELETE B FROM bookmark B INNER JOIN 
    (
    SELECT *FROM (
    select *From bookmark
    except
    select *From bookmarkbackup)T
    )T1 ON T1.AuthorID=B.AuthorID
    AND T1.BookName=B.BookName
    AND T1.BookID=B.BookID
    

    【讨论】:

      【解决方案4】:

      这里有一些你可以测试的东西:

      DECLARE @book table
      (
          AuthorID varchar,
          BookName varchar(255),
          BookID int
      );
      
      DECLARE @backupBook table
      (
          AuthorID varchar,
          BookName varchar(255),
          BookID int
      );
      
      insert into @book values(1, 'book1', 1 )
      insert into @book values(2, 'book2', 2 )
      insert into @book values(3, 'book3', 3 )
      
      insert into @backupBook values(1, 'book1', 1 )
      insert into @backupBook values(2, 'book2', 2 )
      
      select * from @book
      select * from @backupBook
      
      delete a
      from @book a 
      INNER JOIN @backupBook b
        ON a.AuthorID = b.AuthorID
        and a.BookName = b.BookName
        and a.BookID = b.BookID
      
      select * from @book
      select * from @backupBook
      

      【讨论】:

      • 内连接使您可以根据内连接参数删除在两个表上找到的所有行
      • 它将删除主表中的所有行。
      • 尊敬的用户 1926138 复制粘贴并尝试一下 ;) 书 3 保留在 @book 表中,而书 1 和 2 被删除
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多