2012-08-15 69 views
2

的值之間的差值我有兩個表:T_Guest,T_Table如何計算的thecolumns兩個表

T_Guest我的賓客名單。每個客人都有一個ID(g_no)和與客人相關的表格的ID(t_no)。 有可能對同一張桌子會有很多客人相關。

T_Table我有一個表的列表。每個表格都有一個ID(t_no)和一個字段n_places,它描述了該表有多少個地方。

問題: 我需要建立一個SQL查詢(在MS Access中),它將顯示一個仍然有空閒座標的表ID列表。


我有一個想法,首先要找到其中充滿了表的列表,並不僅僅是從整個集團的可用表的落實該組例外。

但要計算有多少表確實有ZERO自由的地方,我需要以某種方式來計算每個表:

n_places - NUMBER_OF_GUESTS_ON_THAT_TABLE 

其中最後一個(NUMBER_OF_GUESTS_ON_THAT_TABLE)這只是:

SELECT COUNT(*) 
FROM T_Table INNER JOIN T_Guest ON T_Table.t_no = T_Guest.t_no 
GROUP BY T_Table.t_no 

但我不知道如何實現差異n_places - NUMBER_OF_GUESTS_ON_THAT_TABLE

有人能幫助我那種任務?

回答

3

您可以使用訪客數作爲派生表:

SELECT t.t_no, t.n_Places-Nz(g.Guests,0) As FreePlaces 
FROM T_Table t 
LEFT JOIN (
    SELECT t_no,COUNT(*) as Guests 
    FROM T_Guest 
    GROUP BY t_no) g 
ON t.t_no = g.t_no 

爲了得到帶有空格的表,你可以添加:

WHERE t.n_Places-Nz(g.Guests,0)>0 
1
SELECT [tt].[t_no] 
FROM T_Table AS tt 
WHERE (SELECT COUNT(*) FROM T_Guest AS tg WHERE tg.t_no = tt.t_no) < tt.n_places 

應在獲得工作,使用子查詢但考慮到上下文,我認爲這不成問題。

+0

它真的有效!謝謝。 – Splanger 2012-08-15 17:30:17

0

這是經典的HAVING子句:

SELECT t_no FROM T_Guest GROUP BY t_no 
HAVING COUNT(*)<(SELECT T_Table.n_Places FROM T_Table WHERE T_Table.t_no=T_Guest.t_no) 
+0

說實話我無法理解這個查詢背後的邏輯:(你能解釋一下給我嗎?具體而言,我不明白的含義:'HAVING COUNT(*)<(SELECT n_Places FROM T_Table WHERE T_Table.t_no = T_Guest,t_no)' – Splanger 2012-08-15 17:39:35

+0

您不能在COUNT()等聚合函數上使用WHERE,對於這些情況,HAVING與WHERE等價。 – 2012-08-15 20:24:43