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,看看这个答案是否有用: