在 c# 中查找一对 SQL 服务器表中的重复数字
Finding duplicate number in couple SQL Server tables in c#
我有一个 SQL 服务器数据库,其中有几个 table 有记录。我的输入是 IMEI 号码,只有当此 IMEI 号码未保存在所有 table 中时,我才必须将其存储在 table 中。我的代码是:
public int Find_IMEI(string IMEI_NUM)
{
IMEI_lab.Text = IMEI_NUM.ToString();
int dflag = 0;
object result;
SqlConnection sqlConn = new SqlConnection(@"Data Source=\SQLEXPRESS;Initial Catalog=manager_db;Integrated Security=True;Pooling=False");
sqlConn.Open();
int test = 0;
for(int kk = 0; kk < comboBox2.Items.Count; kk++)
{
string data_sql = string.Format("IF EXISTS(SELECT 1 FROM {0} WHERE IMEI={1}) SELECT 1 AS FOUND ELSE SELECT 0 AS FOUND", data[kk], IMEI_NUM);
SqlCommand da = new SqlCommand(data_sql, sqlConn);
result = da.ExecuteScalar(); // ExecuteScalar fails on null
if (result.GetType() == typeof(DBNull)) // checking IMEI number in all Tables(orders)
{
dflag = 0;
test = test + dflag;
}
else
{
dflag = (int)result; //(Int32)da.ExecuteScalar();
test = test + dflag;
}
}
sqlConn.Close();
return test;
}
此代码运行良好,returns 计数在所有 table 中找到重复的 IMEI 号码。但我想知道 SQL 是否有以更优化的方式或没有循环的方式完成工作的查询
Table定义:
id | IMEI | Serial | date
----------------------------------------
1 3548690... 0001 15/2/15
2 3548690... 0002 15/2/15
P.S 数据[kk] - 具有 table 个名称的数组
您可以将单个请求发送到 SQL 服务器而不是 N 请求,其中 N 是您的表数, 使用 UNION
子句。
您需要这样的请求:
SELECT SUM(C) FROM
(
SELECT COUNT(*) AS C FROM {Table1} WHERE IMEI = @IMEI
UNION
SELECT COUNT(*) AS C FROM {Table2} WHERE IMEI = @IMEI
UNION
. . .
UNION
SELECT COUNT(*) AS C FROM {TableN} WHERE IMEI = @IMEI
)
据我了解,您的 data[]
数组存储表的名称。
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM [{0}] WHERE IMEI = @IMEI", tableName));
var innerRequest = string.Join(" UNION ", tableRequests);
var finalRequest = string.Format("SELECT SUM(C) FROM ({0})", innerRequest);
using (var command = new SqlCommmand(finalRequest, sqlConn))
{
commman.Parameters.Add("@IMEI", IMEI_NUM);
return (int)command.ExecuteScalar();
}
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM {0} WHERE (IMEI = {1})", tableName, IMEI_NUM));
var innerRequest = string.Join(" UNION ", tableRequests);
var finalRequest = string.Format("SELECT SUM(C) AS EXP FROM ({0}) AS ANS", innerRequest);
using (var command = new SqlCommand(finalRequest, sqlConn))
{
return (int)command.ExecuteScalar();
}
感谢@Mark Shevchenko
我有一个 SQL 服务器数据库,其中有几个 table 有记录。我的输入是 IMEI 号码,只有当此 IMEI 号码未保存在所有 table 中时,我才必须将其存储在 table 中。我的代码是:
public int Find_IMEI(string IMEI_NUM)
{
IMEI_lab.Text = IMEI_NUM.ToString();
int dflag = 0;
object result;
SqlConnection sqlConn = new SqlConnection(@"Data Source=\SQLEXPRESS;Initial Catalog=manager_db;Integrated Security=True;Pooling=False");
sqlConn.Open();
int test = 0;
for(int kk = 0; kk < comboBox2.Items.Count; kk++)
{
string data_sql = string.Format("IF EXISTS(SELECT 1 FROM {0} WHERE IMEI={1}) SELECT 1 AS FOUND ELSE SELECT 0 AS FOUND", data[kk], IMEI_NUM);
SqlCommand da = new SqlCommand(data_sql, sqlConn);
result = da.ExecuteScalar(); // ExecuteScalar fails on null
if (result.GetType() == typeof(DBNull)) // checking IMEI number in all Tables(orders)
{
dflag = 0;
test = test + dflag;
}
else
{
dflag = (int)result; //(Int32)da.ExecuteScalar();
test = test + dflag;
}
}
sqlConn.Close();
return test;
}
此代码运行良好,returns 计数在所有 table 中找到重复的 IMEI 号码。但我想知道 SQL 是否有以更优化的方式或没有循环的方式完成工作的查询
Table定义:
id | IMEI | Serial | date
----------------------------------------
1 3548690... 0001 15/2/15
2 3548690... 0002 15/2/15
P.S 数据[kk] - 具有 table 个名称的数组
您可以将单个请求发送到 SQL 服务器而不是 N 请求,其中 N 是您的表数, 使用 UNION
子句。
您需要这样的请求:
SELECT SUM(C) FROM
(
SELECT COUNT(*) AS C FROM {Table1} WHERE IMEI = @IMEI
UNION
SELECT COUNT(*) AS C FROM {Table2} WHERE IMEI = @IMEI
UNION
. . .
UNION
SELECT COUNT(*) AS C FROM {TableN} WHERE IMEI = @IMEI
)
据我了解,您的 data[]
数组存储表的名称。
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM [{0}] WHERE IMEI = @IMEI", tableName));
var innerRequest = string.Join(" UNION ", tableRequests);
var finalRequest = string.Format("SELECT SUM(C) FROM ({0})", innerRequest);
using (var command = new SqlCommmand(finalRequest, sqlConn))
{
commman.Parameters.Add("@IMEI", IMEI_NUM);
return (int)command.ExecuteScalar();
}
var tableRequests = data.Select(tableName => string.Format("SELECT COUNT(*) AS C FROM {0} WHERE (IMEI = {1})", tableName, IMEI_NUM));
var innerRequest = string.Join(" UNION ", tableRequests);
var finalRequest = string.Format("SELECT SUM(C) AS EXP FROM ({0}) AS ANS", innerRequest);
using (var command = new SqlCommand(finalRequest, sqlConn))
{
return (int)command.ExecuteScalar();
}
感谢@Mark Shevchenko