2

我有两张桌子:T_Guest,T_Table

T_Guest我有一个客人名单。每个来宾都有一个 ID ( g_no ) 和一个与来宾相关的表的 ID ( t_no ) 。有可能同一张桌子上会有很多客人。

T_Table我有一个表列表。每个表都有一个 ID ( t_no ) 和一个字段n_places ,该字段描述了该表有多少个地方。

问题: 我需要构建一个 SQL 查询(在 MS Access 中),它将显示一个表 ID 的列表,这些表 ID 仍然有一个空闲位置。


我有一个想法,首先找到已满的表列表,而不仅仅是从整个可用表组中对该组实施 EXCEPTION 。

但是要计算有多少表确实有零空闲位置,我需要以某种方式计算每个表:

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

有人可以帮我完成那种任务吗???

4

3 回答 3

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
于 2012-08-15T16:04:52.410 回答
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

应该在访问中工作,使用子查询,但考虑到上下文,我认为这不是问题。

于 2012-08-15T16:09:46.643 回答
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)
于 2012-08-15T16:17:21.370 回答