2016-01-10 111 views
0

我有2個相關表格:「大學」(id,num_courses)和「課程」(id,university_id)。我需要University.num_courses來代表COUNT課程。根據相關表更新HSQL表值

我可以查詢數據,我需要:

SELECT 
Universities.id, 
COUNT(Courses.university_id) as NumCourses 
FROM Courses 
JOIN Universities ON Universities.id = Courses.university_id 
GROUP BY Universities.id 

如何更新它的大學?它可以自動完成嗎?

+2

這是普遍不好的數據庫設計存儲的計算值在表格中 - 計算的值應該通過查詢或視圖進行查看和處理。你爲什麼想要這樣做?也許我們可以建議一種更好的方式來獲得您所期望的最終用途。 – Lyrl

+0

就「自動」而言,如果您的後端支持,您可以在數據庫中設置一個「觸發器」。默認的HSQLDB版本1.8後端在Base內部壓縮,不支持觸發器 - 您需要升級到HSQLDB版本2或您選擇的其他數據庫的「拆分」(即不在Base內)後端。 – Lyrl

+0

@Lyrl我完全同意你的看法,但情況很複雜。基本上,我正在幫助一個有數據庫項目的朋友,他的老師批准他們一起完成的設計。他對數據庫(包括我)並不那麼光明,並且擔心會放棄他們已經達成一致的設計,但同時也必須實施那些無效的解決方案。也許這是教育的一部分,旨在爲公司做好準備工作= D –

回答

1

我不知道這是你的意思是「自動」,但它可以用一個循環來實現:

Sub UpdateUniversities 
    Context = CreateUnoService("com.sun.star.sdb.DatabaseContext") 
    databaseURLOrRegisteredName = "file:///C:/Users/JimStandard/Desktop/New Database.odb" 
    Db = Context.getByName(databaseURLOrRegisteredName) 
    Conn = Db.getConnection("","") 'username & password pair - HSQL default blank 
    Stmt = Conn.createStatement() 
    strSQL = "SELECT Universities.id, " & _ 
     "COUNT(Courses.university_id) as NumCourses " & _ 
     "FROM Courses " & _ 
     "JOIN Universities ON Universities.id = Courses.university_id " & _ 
     "GROUP BY Universities.id" 
    oResult = Stmt.executeQuery(strSQL) 
    Do While oResult.next() 
     university_id = oResult.getLong(1) 
     num_courses = oResult.getLong(2) 
     Stmt = Conn.createStatement() 
     strSQL = "UPDATE ""Universities"" SET ""num_courses"" = " & _ 
      num_courses & " WHERE ""id"" = " & university_id 
     Stmt.executeUpdate(strSQL) 
    Loop 
    Conn.close() 
End Sub 

相關:How to create an update query with Open Office Base?

+0

請注意,這是一個需要定期運行或綁定到某個事件(例如表單上的按鈕)的宏。 – Lyrl