2013-03-24 68 views
1

我有這樣如何解決子查詢

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 

回答

1

你可能想是這樣的:

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

要從Circulation其中sr_no列等於最大所有sr_no值在表中選擇行(S) - 對嗎?

+0

謝謝先生,我只想要那個。 非常感謝您的幫助 – 2013-03-24 17:16:31

+0

使用TOP 1而不是嵌套SELECT會更好嗎?使用ORDER BY和TOP 1做同樣的事情,並且有一個改進的執行計劃。 – 2013-03-24 17:19:18

+0

@AlexS .:取決於您是否真的只想要第一行的頂部值 - 或者您希望**所有行具有最大值?那麼'TOP 1'就不合適了。 – 2013-03-24 17:20:28

1

SQL Server支持公共表表達式窗函數ROW_NUMBER()將按照AccessionNo的降序排列SR_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 
1
SELECT TOP 1 * 
FROM Circulation 
WHERE accessionno = @accessionno 
ORDER BY Sr_no DESC 

而且,最好不要使用SELECT *,而使用的列名。