Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL批量删除查询_Sql_Sql Server - Fatal编程技术网

SQL批量删除查询

SQL批量删除查询,sql,sql-server,Sql,Sql Server,我有以下疑问: DELETE FROM [Entry] WHERE CompanyId = 1 AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) AND Entry_Date = '2016-12-01' AND Entry_Method = 'I' DELETE FROM [WrongEntry] WHERE CompanyId = 1 AND EmployeeId IN (4, 7,

我有以下疑问:

DELETE FROM [Entry] 
WHERE CompanyId = 1 
  AND EmployeeId IN (3, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
  AND Entry_Date = '2016-12-01' 
  AND Entry_Method = 'I'

DELETE FROM [WrongEntry] 
WHERE CompanyId = 1 
  AND EmployeeId IN (4, 7, 14, 17, 20, 21, 22, 24....100 more) 
  AND Entry_Date = '2016-12-01' 
  AND Entry_Method = 'I'

DELETE FROM [Entry] 
WHERE CompanyId = 1 
  AND EmployeeId IN (1, 4, 6, 7, 14, 17, 20, 21, 22,....100 more) 
  AND Entry_Date = '2016-12-02' 
  AND Entry_Method = 'I'

DELETE FROM [WrongEntry] 
WHERE CompanyId = 1 
  AND EmployeeId IN (5, 7, 14, 17, 20, 21, 22, 24....100 more) 
  AND Entry_Date = '2016-12-02' 
  AND Entry_Method = 'I'
像这样,从2016年12月1日到2016年12月31日,我有一个完整的月份

当我运行这些查询时,会花费很多时间&而且在执行这些查询时,表会被锁定一段时间,直到执行完成

在上述场景中,批量删除的最佳方式是什么?还有别的办法吗?如何快速批量删除这些查询


注意
EmployeeId
在任何时候都是不同的

也许使用不等式就是你想要的:

DELETE FROM [Entry]
    WHERE CompanyId=1 AND
          EmployeeId IN (3,4,6,7,14,17,20,21,22,....100 more) AND
          Entry_Date >= '2016-12-01' AND
          Entry_Date < '2017-01-01' AND
          Entry_Method = 'I';
从[条目]中删除
其中CompanyId=1,并且
员工ID(3,4,6,7,14,17,20,21,22,…100多人)和
输入日期>='2016-12-01'和
输入日期<'2017-01-01'和
条目_方法='I';

也许使用不等式可以满足您的需要:

DELETE FROM [Entry]
    WHERE CompanyId=1 AND
          EmployeeId IN (3,4,6,7,14,17,20,21,22,....100 more) AND
          Entry_Date >= '2016-12-01' AND
          Entry_Date < '2017-01-01' AND
          Entry_Method = 'I';
从[条目]中删除
其中CompanyId=1,并且
员工ID(3,4,6,7,14,17,20,21,22,…100多人)和
输入日期>='2016-12-01'和
输入日期<'2017-01-01'和
条目_方法='I';

您可以更改查询以查找日期范围而不是特定日期

试试这个

DELETE FROM [Entry] WHERE CompanyId=1 AND EmployeeId IN(3,4,6,7,14,17,20,21,22,....100 more) 
AND Entry_Date >= '2016-12-01' AND Entry_Date <= '2016-12-31'
AND Entry_Method = 'I'

DELETE FROM [WrongEntry] WHERE CompanyId=1 AND EmployeeId IN(4,7,14,17,20,21,22,24....100 more) 
AND Entry_Date >= '2016-12-01' AND Entry_Date <= '2016-12-31'
AND Entry_Method = 'I'
从[Entry]中删除,其中CompanyId=1,EmployeeId在(3,4,6,7,14,17,20,21,22,….100以上)

输入日期>='2016-12-01'和输入日期='2016-12-01'和输入日期您可以更改查询以查找日期范围而不是特定日期

试试这个

DELETE FROM [Entry] WHERE CompanyId=1 AND EmployeeId IN(3,4,6,7,14,17,20,21,22,....100 more) 
AND Entry_Date >= '2016-12-01' AND Entry_Date <= '2016-12-31'
AND Entry_Method = 'I'

DELETE FROM [WrongEntry] WHERE CompanyId=1 AND EmployeeId IN(4,7,14,17,20,21,22,24....100 more) 
AND Entry_Date >= '2016-12-01' AND Entry_Date <= '2016-12-31'
AND Entry_Method = 'I'
从[Entry]中删除,其中CompanyId=1,EmployeeId在(3,4,6,7,14,17,20,21,22,….100以上)

输入日期>='2016-12-01'和输入日期='2016-12-01'和输入日期我的第一个建议是将列表放入临时表或表变量中,这是EmployeeId=>tempEmployees。第二种是应用块删除,这种技术非常有效,可以避免与锁定相关的问题,下面是一个示例:

简言之:

SET NOCOUNT ON;

DECLARE @r INT;

SET @r = 1;

WHILE @r > 0
BEGIN
    BEGIN TRANSACTION;

    DELETE TOP (5000) FROM TableToDelete;

    SET @r = @@ROWCOUNT;

    COMMIT TRANSACTION;
END

我的第一个建议是将列表放入临时表或表变量中,即EmployeeId=>tempEmployees。第二种是应用块删除,这种技术非常有效,可以避免与锁定相关的问题,下面是一个示例:

简言之:

SET NOCOUNT ON;

DECLARE @r INT;

SET @r = 1;

WHILE @r > 0
BEGIN
    BEGIN TRANSACTION;

    DELETE TOP (5000) FROM TableToDelete;

    SET @r = @@ROWCOUNT;

    COMMIT TRANSACTION;
END

这对我不合适。我有很多不平等,@Anup。这是什么意思?如果您试图在每个日期删除不同的ID,那么单独的查询可能是最简单的方法。这对我来说不行。我有很多不平等,@Anup。这是什么意思?如果您试图在每个日期删除不同的ID,那么单独的查询可能是最简单的方法?这不都是同一张单子吗?没错。那是我的问题。EmployeeId总是不同的。错过了一个重要的细节。感谢@HoneyBadger将其选中。您能否轻松使用需要删除的
employeeId
Entry\u Date
组合构建一个临时表?如果是这样,您可以轻松地将该表连接到需要删除的表(或使用
exists
或其他内容)。你如何知道你需要哪个
employeeId
列表?@Anup,看看这个答案是否有用:
employeeId
中的理性是什么?这不都是同一张单子吗?没错。那是我的问题。EmployeeId总是不同的。错过了一个重要的细节。感谢@HoneyBadger将其选中。您能否轻松使用需要删除的
employeeId
Entry\u Date
组合构建一个临时表?如果是这样,您可以轻松地将该表连接到需要删除的表(或使用
exists
或其他内容)。你如何知道你需要哪个
employeeId
列表?@Anup,看看这个答案是否有用: