我有两个表:T_Guest,T_Table
在 T_Guest 中,我有一个来宾列表。每位访客都有一个ID( g_no )和与该访客相关的表格( t_no )的ID。 有可能在同一张桌子上会有很多客人。
在 T_Table 中,我有一个表格列表。每个表都有一个ID( t_no )和一个字段 n_places ,用于描述该表所拥有的位数。
问题: 我需要构建一个SQL查询(在MS Access中),它将显示一个表ID的列表,这些表仍然是免费的。
我有一个想法,首先找到已满的表的列表,而不仅仅是从整个可用表组中对该组实现EXCEPTION。
但是为了计算有多少个表确实有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
但我不知道如何实施DIFFERENCE n_places - NUMBER_OF_GUESTS_ON_THAT_TABLE
有人可以帮助我完成这项任务吗?
答案 0 :(得分: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 :(得分: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
应该在访问中工作,使用子查询但是在给定上下文的情况下我不认为这将是一个问题。
答案 2 :(得分: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)