在我的 SQL 中对小于 10 的约束进行分组

Posted

技术标签:

【中文标题】在我的 SQL 中对小于 10 的约束进行分组【英文标题】:Grouping in my SQL for a constraint less than 10 【发布时间】:2019-11-20 18:07:18 【问题描述】:

在尝试这个问题时,我不知道应该使用哪个表格,或者我应该join 表格吗?

列出数据库中房间少于 10 间的酒店总数。

酒店(酒店编号、酒店名称、城市)

房间(房间号、酒店号、类型、价格) 预订(hotelNo、guestNo、dateFrom、dateTo、roomNo)

来宾(guestNo、guestName、guestAddress)

我已经尝试在我的声明中只使用一张表Room

SELECT hotelNo 
FROM Room
WHERE roomNo < 10
GROUP BY hotelNo;

这是正确的还是我应该使用类似的东西?

SELECT h.hotelNo,r.roomNo 
FROM Hotel h JOIN Room r ON h.hotelNo= r.hotelNo
WHERE r.roomNo < 10
GROUP BY hotelNo;

【问题讨论】:

【参考方案1】:

假设所有酒店都至少有一个房间,您不需要加入。但是,您确实需要聚合:

select count(*)
from (select r.hotelno
      from rooms r
      group by r.hotelno
      having count(*) < 10
     ) r;

子查询返回房间少于 10 个的酒店(并且在 rooms 表中,因此它们至少有一个房间)。

外部查询统计此类酒店的数量。

【讨论】:

@Gordon Linoff:r 在查询结束时做了什么,还有 Count (*) 还有其他选项卡。这怎么知道只算酒店?数据库中还有其他表我已经编辑了我的问题以显示它们 @Liam。 . . r 是表别名。正如我在答案中解释的那样,内部查询列出了符合您条件的酒店。外部查询计算列表中的行数。【参考方案2】:

检查具有顺序的计数以应用于组,并计算该查询返回的行数

SELECT COUNT(*)
FROM (
    SELECT hotelRo
    FROM Room
    GROUP BY hotelNo
    HAVING COUNT(*)<10
) AS TMP;

【讨论】:

您可以仅使用 Room 表来执行此操作吗?或者这是不正确的 您的意思是只使用一个查询?我认为你不能,因为如果你在子查询中选择 count(*),它将返回每个组的大小而不是整个集合

以上是关于在我的 SQL 中对小于 10 的约束进行分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL 中多列“级联”约束的优雅语法?

如何从相关表中对 SQL 中的结果进行分组?

SQL CHECK 约束

需要在 SQL 中对值进行分组

在 MATLAB 中对具有额外参数传递给它的成本函数进行约束优化

SQL CHECK 约束:使用方法及撤销方法剖析