我需要从密钥具有重复条目的表中选择并获取单个唯一值。例如,有一个交易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;
答案 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是正确的,你冒着通过在查询中直接使用文本框中的值来劫持你的代码的风险:)