2012-08-25 54 views
0

這是學生圖書館項目的一部分。插入語句不會在數據庫中插入多於一行

有2個表:alertsborrows

borrows包含studentID,bookIDdate of borrowing

alerts指示哪些學生過期多少本書。

該代碼應該爲每個過期的學生插入一行,並計算過期的書籍數量。

Est_Return_Date = return_date + 30 

insert into dbo.Alert (studentID, AlertCount) 
    values ((select distinct (studentID)from dbo.Borrows 
     where Est_Return_Date < GETDATE() 
     and return_date is null), 
     (select count(studentID) from dbo.Borrows 
     where Est_Return_Date < GETDATE() 
     and return_date is null)) 
+1

計數將始終返回一個值。而另一個選擇可能還會返回一個值,那就是你的問題。你有錯誤的查詢 –

+0

在查詢中使用'GetDate()'是追逐一個移動的目標,影響性能,並可能產生好奇的結果。隨着日期的變化。在變量中捕獲當前日期/時間幾乎總是一個更好的主意,然後根據需要使用該值。在存儲過程中,這在多個語句中更重要。多次使用'GetDate()'的最常見原因是捕獲長時間運行操作的開始和結束時間。 – HABO

回答

2

你將要使用GROUP BY,而不是子查詢,你想要的是每studentId的結果,所以GROUP BY這一點,COUNT與警報行;

INSERT INTO dbo.Alert (studentID, AlertCount) 
SELECT studentID,COUNT(*) 
FROM dbo.Borrows 
WHERE Est_Return_Date < GETDATE() 
AND return_date is NULL 
GROUP BY studentID; 

演示here

1

試試這個

insert into dbo.Alert (studentID, AlertCount) 
select studentId, count(*) as AlertCount from dbo.Borrows where Est_Return_Date < GETDATE() 
     and return_date is null group by studentId 

考慮你想要做什麼,你的查詢將始終插入值1 - 計數被返回的學生總數計數,並可能是你的另一個選擇也返回一個只有價值。此查詢將按學生分組,並計算其他表的總書數,逾期時間

通過here閱讀有關組的內容。如果它是MySQL也可以。 另一個頁面,其中一個例子,是here