SQL Server如何筛选所有关联所有者满足最低现金余额的房产ID
在SQL Server中筛选所有所有者现金达标的房产ID
需求回顾
我们有一张包含property_id(房产ID)、owner_id(所有者ID)、owner_cash(所有者现金余额)的表,需要返回所有关联所有者的现金余额均满足最低要求的房产ID——只要该房产有任意一位所有者现金未达标,就排除该房产。
示例数据:
| 房产ID(property_id) | 所有者ID(owner_id) | 所有者现金余额(owner_cash) |
|---|---|---|
| 101 | 584 | 200000 |
| 102 | 882 | 10000 |
| 102 | 883 | 86500 |
| 102 | 884 | 140000 |
| 103 | 910 | 268000 |
| 103 | 911 | 300000 |
当最低现金要求为50000时,预期结果:
| 房产ID(property_id) |
|---|
| 101 |
| 103 |
(房产102因所有者882的现金余额不足被排除)
最优实现方案
SQL是基于集合操作的语言,递归CTE和WHILE循环并非最优选择——这类逐行处理的方式代码复杂且性能低下。以下两种方案是更高效、简洁的实现:
方案一:分组聚合筛选最小值达标
利用分组后取每个房产的最小现金余额,若最小值满足要求,则该房产所有所有者的现金都达标:
-- 设置最低现金要求 DECLARE @MinCash INT = 50000; SELECT property_id FROM YourTableName -- 替换为你的表名 GROUP BY property_id HAVING MIN(owner_cash) >= @MinCash;
逻辑说明:每个房产的MIN(owner_cash)是该房产所有者的最低现金余额,只要这个最小值大于等于要求值,就意味着所有所有者的现金都达标。此方案逻辑直观,聚合操作的性能优异,适合大数据量场景。
方案二:排除存在不达标所有者的房产(NOT EXISTS)
通过子查询找出所有存在至少一位现金不达标的房产,再在主查询中排除这些房产:
DECLARE @MinCash INT = 50000; SELECT DISTINCT property_id FROM YourTableName t1 WHERE NOT EXISTS ( SELECT 1 FROM YourTableName t2 WHERE t2.property_id = t1.property_id AND t2.owner_cash < @MinCash );
逻辑说明:子查询会定位到所有包含现金不足所有者的房产ID,NOT EXISTS则将这些房产从结果中排除。如果property_id和owner_cash有索引,SQL Server的查询优化器会生成高效的执行计划,性能同样出色。
方案对比
两种方案都能高效实现需求:
- 方案一更简洁,代码量少,聚合操作在数据量较大时通常有更好的性能;
- 方案二的逻辑更贴近"排除不合格项"的直观思路,适合需要扩展条件的场景。
内容的提问来源于stack exchange,提问作者jonrb
相关产品推荐
相关产品推荐

