从多个表中选择最大数量
Posted
技术标签:
【中文标题】从多个表中选择最大数量【英文标题】:Select Max Number From Multiple Tables 【发布时间】:2018-03-20 07:13:03 【问题描述】:我正在研究自动生成代码收据编号。这是我的代码:
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 中执行此操作?
【问题讨论】:
这是一个有缺陷的设计,势必会给你带来越来越多的问题,尤其是在多用户环境中 这感觉像是一个 XY 问题 - meta.stackexchange.com/questions/66377/what-is-the-xy-problem。 为什么你需要这样做? 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。 【参考方案1】: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
而且一般情况下对所有三个表都使用一个序列更正确,新值的定义不会有问题
【讨论】:
【参考方案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
如果你有 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
【讨论】:
您好,先生,谢谢您的回复,我试试这个,但在表 1 收据中最高的是 02,在表 2 中收据编号是 010,在表 3 中收据编号是 037,所以它必须显示 037 但是其显示09来自表2 @Vikas .. 但是.. ? 对不起我的英语先生 不应该是UNION ALL
而不是UNION
?
@Vikas:你在这个序列中使用 VarChars 吗?哎哟。顺便说一句,您是否注意到您的方法也因单个表而失败:-)【参考方案3】:
使用存储过程来实现 ID 逻辑。在存储过程中,您可以从所有相关表中找到 ID 并计算最大 ID。然后,您将从应用程序调用存储过程。
要获得更好的解决方案,请阅读实体关系设计。收据是一个实体,它应该在一个地方定义收据,包括其 ID(主键)。如果在其他表中使用了收据 ID,则这称为外键,应在数据库中强制执行,以确保表中引用的每个 ID 都已存在于“主”收据表中。
【讨论】:
您好先生,Under先生,非常感谢您给我的想法,这对我保住我的工作非常有帮助,非常感谢以上是关于从多个表中选择最大数量的主要内容,如果未能解决你的问题,请参考以下文章