Database-Design
使用聚合訪問 Web 應用程序查詢 3 個表 - 需要一種解決方法
我正在設計一個 Access 2016 Web 應用程序來盤點我們的電腦。
我遇到的問題是我想獲取每台 PC 的 CPUCore-amount 和 RAM-Amount 的查詢。
RAM 和 CPU 中的電腦值是在 Computer.DNS 上的查找所以在 SQL 中它會類似於
SELECT Computer.DNS,SUM(CPU.Cores),SUM(RAM.Size) FROM Computer,CPU,RAM GROUP BY Computer.DNS
GUI-Query 的結果都是
兩個 SUM 列(對於大多數 PC)都是錯誤的。
它使用的公式(這是錯誤的!):
Cores: COUNT(CPUs) * realAmount RAM : COUNT(RAM-sticks) * realAmount
誰能告訴我為什麼會這樣做以及我做錯了什麼?
我嘗試使用
Cores: Sum([CPU].[Cores]-Count([RAM].[Size]))
在“欄位”欄位中,但我收到錯誤“表達式中不能有聚合函式”
我有一種解決方法,它為每個連接 DNS 和 SUM(foo) 的 1:n 關係進行單獨查詢,並且一個查詢包含所有查詢的結果。然後在查詢的小 ERM 中,我連接查詢的每個 DNS 條目。對於數據庫中的 1:1 關係,我可以只使用整體查詢中的標準表。
雖然仍在尋找其他解決方法
您正在表之間進行笛卡爾積(或交叉連接),這意味著您正在將所有 cpu 和所有記憶體“分配”給所有電腦。
您需要使用 where 子句限制連接,例如:
SELECT Computer.DNS,SUM(CPU.Cores),SUM(RAM.Size) FROM Computer,CPU,RAM WHERE Computer.id = CPU.computer AND Computer.id = RAM.computer GROUP BY Computer.DNS
這樣每台電腦只與它的記憶體和 CPU 相關。
如果您使用 ANSI JOIN 代替,IMO 會更清楚:
SELECT Computer.DNS,SUM(CPU.Cores),SUM(RAM.Size) FROM Computer JOIN CPU ON Computer.id = CPU.computer JOIN RAM ON Computer.id = RAM.computer GROUP BY Computer.DNS
您也可以為表格使用別名,使其更短:
SELECT c.DNS, SUM(CP.Cores), SUM(R.Size) FROM Computer as c JOIN CPU as cp ON c.id = cp.computer JOIN RAM as r ON c.id = r.computer GROUP BY c.DNS