如何解决子查询

本文关键字:查询 解决 何解决 | 更新日期: 2023-09-27 18:05:39

我有这样的数据

Sr_No/ AccessionNo  / Roll_nO   / Price
---------------------------------------    
1  /     101     /      45   /     1000
2  /     102        /   46     /   2000
3   /    101       /    43    /    500

我已经写了这个查询

select * 
from Circulation 
where MAX(sr_no) in (select * 
                     from circulation 
                     where accessionno = @accessionno)

我想获取文本框给出的入库号的值,它应该是Sr_No的最大值,并且对于信息Sr_NO是自动递增的。

我的查询不起作用

我是一名学生,几个月前开始了 c#

对不起,我的英语不好

我收到此错误

聚合可能不会显示在 WHERE
中 子句,除非它位于 HAVING 子句或选择列表中包含的子查询中,并且 正在聚合的列是外部引用。
当子查询未随 EXISTS 一起引入时,只能在选择列表中指定一个表达式。

当我输入 101 作为入藏号时,我希望它

3   /    101       /    43    /    500

如何解决子查询

你可能想要这样的东西:

SELECT * 
FROM Circulation 
WHERE sr_no = (SELECT MAX(sr_no)
               FROM circulation 
               WHERE accessionno = @accessionno)

您想从Circulation中选择行,其中sr_no列等于表中所有sr_no值的最大值 - 对吗?

SQL Server支持Common Table ExpressionWindow FunctionROW_NUMBER()将按降序排列每个AccessionNoSR_NO。因此,1的值是针对每AccessionNo的最高SR_NO给出的。

WITH records
AS
(
    SELECT  Sr_No, AccessionNo, Roll_nO, Price,
            ROW_NUMBER() OVER(PARTITION BY AccessionNo ORDER BY Sr_No DESC) rn
    FROM    Circulation 
)
SELECT  Sr_No, AccessionNo, Roll_nO, Price
FROM    records
WHERE   rn = 1 

但是,如果已经给出了AccessionNo,一个简单的TOP就可以完成您的工作。

SELECT   TOP 1 * 
FROM     Circulation 
WHERE    accessionno = @accessionno
ORDER BY Sr_no DESC
SELECT TOP 1 * 
FROM Circulation 
WHERE accessionno = @accessionno
ORDER BY Sr_no DESC

此外,最好不要使用 SELECT *,而是使用列名称。