在c#中的几个SQL Server表中查找重复的数字

时间:2015-02-15 08:05:46

标签: c# database sql-server-2014

我有一个带有记录的几个表的SQL Server数据库。我的输入是IMEI号,只有当这个IMEI号没有保存在所有表中时,我才必须存储在表中。我的代码是:

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;
    }

此代码工作正常,返回所有表中找到的重复IMEI编号的计数。但是我想知道SQL是否有查询以更优化的方式或没有循环来完成工作

表格定义:

id |  IMEI       | Serial   | date
----------------------------------------
 1   3548690...    0001       15/2/15
 2   3548690...    0002       15/2/15

P.S data [kk] - 表名为

的数组

2 个答案:

答案 0 :(得分:1)

您可以使用UNION子句将单个请求发送到SQL服务器而不是 N 请求,其中 N 是表的数量。

你需要这样的请求:

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();
}

答案 1 :(得分:0)

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