Database-Design

使用聚合訪問 Web 應用程序查詢 3 個表 - 需要一種解決方法

  • March 1, 2022

我正在設計一個 Access 2016 Web 應用程序來盤點我們的電腦。

我遇到的問題是我想獲取每台 PC 的 CPUCore-amount 和 RAM-Amount 的查詢。

GUI-Query

RAM 和 CPU 中的電腦值是在 Computer.DNS 上的查找所以在 SQL 中它會類似於

SELECT Computer.DNS,SUM(CPU.Cores),SUM(RAM.Size) FROM Computer,CPU,RAM GROUP BY Computer.DNS 

GUI-Query 的結果都是

![結果2]

兩個 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

引用自:https://dba.stackexchange.com/questions/138349