在 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