2016-01-10 67 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