从多个表中选择最大数量

时间:2018-03-20 07:13:03

标签: c# sql asp.net sql-server

我正在处理代码收据编号自动生成。这是我的代码:

var conrecipt = new SqlConnection(
    ConfigurationManager.ConnectionStrings["con"].ConnectionString);
conrecipt.Open();
var cmd = new SqlCommand("Select COALESCE(MAX(Reciptno),0) from Registration", conrecipt);
int i = Convert.ToInt32(cmd.ExecuteScalar());
conrecipt.Close();
i++;
Label3.Text = Reciptno + i.ToString();

工作正常。但是我需要检查3个表:Registration,Advance和另外一个表,需要找到这些id的最大值。

如何在Asp.Net C#和MS SQL Server 2012中执行此操作?

3 个答案:

答案 0 :(得分:3)

SELECT MAX(M)
FROM
(
    SELECT MAX(Value) as M Table1
    UNION ALL
    SELECT MAX(Value) as M Table2
    UNION ALL
    SELECT MAX(Value) as M Table3
) as x

一般而言,对所有三个表使用序列更为正确,并且新值的定义不会出现问题

答案 1 :(得分:2)

您可以使用union获取所有的reciptno并选择最大值

 select COALESCE(MAX(Reciptno),0) 
   from (
    Select Reciptno 
    from Registration
    UNION 
    Select Reciptno 
    from Advance
    UNION 
    Select Reciptno  
    from one_more_table
    ) as t

AND如果你有nvarchar,你可以使用转换

select COALESCE(MAX( convert (int, t.Reciptno)),0) 
   from (
    Select Reciptno 
    from Registration
    UNION 
    Select Reciptno 
    from Advance
    UNION 
    Select Reciptno  
    from one_more_table
    ) as t

答案 2 :(得分:0)

使用存储过程实现ID逻辑。在存储过程中,您可以从所有相关表中找到ID并计算最大ID。然后,您将从应用程序中调用存储过程。

要获得更好的解决方案,请阅读有关实体关系设计的内容。收据是一个实体,应该在一个地方定义收据,包括其ID(主键)。如果在其他表中使用了Receipt Id,则称为外键,应在数据库中强制执行,以确保表中引用的每个ID都已存在于“主”收据表中。