如何解决子查询

时间:2013-03-24 17:04:47

标签: c# sql-server database

我有这样的数据

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

3 个答案:

答案 0 :(得分:1)

SQL Server支持公用表表达式窗口函数ROW_NUMBER()会按SR_NO的降序排列AccessionNo。因此1的价值是SR_NOAccessionNo个最高{/ p}}。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你可能想要这样的东西:

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

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