如何从表中选择MAX(Id)max其中key = some_value在SQL C#中?

时间:2016-06-12 11:58:00

标签: c# mysql sql sql-server visual-studio

我需要从密钥具有重复条目的表中选择并获取单个唯一值。例如,有一个交易ID(Id)和一个AccountNumber(AccountNumber),并且对于每个帐号,有许多条目,但我必须只获得特定AccountNumber的最大(交易ID)(Id)。我是以下代码,但在结果中给了我多行。我做得对吗?此代码中没有语法错误。如果我删除GROUP BY,则会给出一个错误,指出没有Group BY语句。

        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConString"].ConnectionString);
        con.Open();
        DataTable dt = new DataTable();
        SqlDataAdapter sda = new SqlDataAdapter("select MAX(Id), Address, AccountNumber, Date, CustomerName, Debit, Credit, Balance from fianlTable WHERE (AccountNumber='"+textBox4.Text+"') ) GROUP BY Id, Address, AccountNumber, Date, CustomerName, Debit, Credit, Balance", con);
        sda.Fill(dt);
        dataGridView1.DataSource = dt;

3 个答案:

答案 0 :(得分:3)

如果您有兴趣知道特定AccountNumber的特定ID的MAX,那么您不需要GROUP BY的其他字段

using(SqlConnection con = new SqlConnection(.....))
using(SqlCommand cmd = new SqlCommand(@"select MAX(Id)
                                        from fianlTable 
                                        WHERE AccountNumber=@num"), con)
{
    int maxValue = 0;
    con.Open();
    cmd.Parameters.Add("@num" SqlDbType.NVarChar).Value = textBox4.Text;
    object result = cmd.ExecuteScalar();
    if(result != null) 
      maxValue = Convert.ToInt32(result);
}

因此不需要SqlDataAdapter所需的所有基础结构,只需要一个SqlCommand,它的文本和对ExecuteScalar的调用。另请注意,连接和命令等一次性对象由using语句括起来,以确保正确关闭和处理

这里还有其他的话要说。我不知道这段代码背后的原因,但我希望不是要在INSERT命令中分配下一个ID。在这种情况下使用MAX是错误的,因为在多用户环境中无法信任返回的值

答案 1 :(得分:0)

如果你想要max(id)那么那个colunmn不应该分组

"select 
     Id
    , Address
    , AccountNumber
    , Date
    , CustomerName
    , Debit
    , Credit
    , Balance 
from fianlTable 
WHERE id = (select max(id) from fianlTable 
           WHERE  AccountNumber='"+textBox4.Text+"' 
GROUP BY AccountNumber);"

答案 2 :(得分:-3)

不是特定于C#但更基于SQL,您可以选择帐号的记录 - 按TransactionId Desc排序并将结果限制为1.

这看起来像是:

SELECT Id, Address, AccountNumber, Date, CustomerName, Debit, Credit, Balance from fianlTable WHERE (AccountNumber='"+textBox4.Text+"') ORDER BY Id DESC LIMIT 1

BTW Lucas是正确的,你冒着通过在查询中直接使用文本框中的值来劫持你的代码的风险:)