需要帮助提高SQL DELETE性能

问题描述 投票:1回答:1

我有两个关系,客户和地址。首先,我没有修改数据库的权限(例如为客户和地址创建新版本)。我需要的是,给定一个状态列表,删除具有与该状态相关的Adress1或Adress2的客户。我在下面所做的工作很慢,因此不胜感激。

foreach (State state in listOfStates)
{
  query = 
   "DELETE FROM CUSTOMER
    WHERE EXISTS (
     SELECT * FROM ADRESS
     WHERE CUSTOMER.ADRESS1 = ADRESS.ID
     AND STATE = " + state + ")";
  cmd.CommandText = query;
  cmd.ExecuteNonQuery();

  query = 
   "DELETE FROM CUSTOMER
    WHERE EXISTS (
     SELECT * FROM ADRESS
     WHERE CUSTOMER.ADRESS2 = ADRESS.ID
     AND STATE = " + state + ")";
  cmd.CommandText = query;
  cmd.ExecuteNonQuery();
}

Customer
+----------+---------+---------+--+
|   Name   | Adress1 | Adress2 |  |
+----------+---------+---------+--+
| John Doe |       1 |       2 |  |
| Victor   |       3 |       4 |  |
| Renat    |       5 |       6 |  |
+----------+---------+---------+--+

Adress

+----+--------+------+------------+
| ID | Street | City |   State    |
+----+--------+------+------------+
|  1 | xxx    | xxx  | California |
|  2 | xxx    | xxx  | Florida    |
|  3 | xxx    | xxx  | California |
|  4 | xxx    | xxx  | Ohio       |
|  5 | xxx    | xxx  | Virginia   |
|  6 | xxx    | xxx  | Colorado   |
+----+--------+------+------------+
c# sql database ms-access sql-delete
1个回答
0
投票

我建议您为各州建立一个IN子句。如果您的listOfStates为List<string>,则为:

string states = "'" + string.Join("','", listOfStates) + "'";

((这将导致类似于'Arizona','Kentucky','Tennessee',即用逗号分隔的字符串,所有状态都用单引号引起来。)

如果listOfStates不是List<string>,则调整上面的内容以符合您的收集类型,例如

string states = "'" + string.Join("','", listOfStates.Select(state => state.Name)) + "'";

然后在所有状态下运行一个删除语句:

query = 
 "DELETE FROM customer
  WHERE EXISTS (
   SELECT * FROM adress
   WHERE adress.id IN (customer.adress1, customer.adress2)
   AND adress.state IN (" + states + "))";

cmd.CommandText = query;
cmd.ExecuteNonQuery();
© www.soinside.com 2019 - 2024. All rights reserved.