如何查询所有业务单元下row_status均为0的service_code
解决SQL查询:获取所有关联business_unit_id的row_status全为0的service_code
有一张名为disp的表,包含service_code、row_status、business_unit_id三列,表中数据如下:
| service_code | row_status | business_unit_id |
|---|---|---|
| A | 1 | BU1 |
| A | 0 | BU2 |
| A | 0 | BU3 |
| B | 1 | BU1 |
| B | 0 | BU2 |
| C | 0 | BU2 |
| C | 0 | BU3 |
需求是编写SQL查询,获取所有关联的business_unit_id对应的row_status全部为0的service_code,示例中正确结果应为C。但现有查询返回了A、B、C,结果错误,表有数百万条记录,需要正确的查询方法。
原错误查询代码:
create table #tmpTable (pc_ccs_9xx_service_code varchar(10)); create table #tmpTable1 (pc_ccs_9xx_service_code varchar(10)); insert into #tmpTable select top 500 pcdis.service_code from pc_ccs_9xx_deposit_install_service pcdis where pcdis.row_status = 1 order by pcdis.service_code asc select * from #tmpTable insert into #tmpTable1 select top 500 pcdis.service_code from pc_ccs_9xx_deposit_install_service pcdis join #tmpTable tt on tt.pc_ccs_9xx_service_code = pcdis.service_code and pcdis.row_status = 1 order by pcdis.service_code asc select top 500 tt.pc_ccs_9xx_service_code from #tmpTable tt join #tmpTable1 tt1 on --tt1.pc_ccs_9xx_service_code = tt.pc_ccs_9xx_service_code and tt1.pc_ccs_9xx_service_code not in (select top 100 pc_ccs_9xx_service_code from #tmpTable) order by tt.pc_ccs_9xx_service_code asc DROP table #tmpTable DROP table #tmpTable1
正确查询方法(适配百万级数据量)
方法一:分组聚合筛选
通过分组后判断最大row_status是否为0,直接筛选出所有关联记录row_status全为0的service_code,性能最优:
SELECT service_code FROM disp GROUP BY service_code HAVING MAX(row_status) = 0;
优化建议:给service_code和row_status创建复合索引,能大幅提升分组聚合的效率。
方法二:NOT EXISTS排除法
排除掉存在至少一条row_status=1的service_code,逻辑直观,适合有索引的场景:
SELECT DISTINCT service_code FROM disp d WHERE NOT EXISTS ( SELECT 1 FROM disp WHERE service_code = d.service_code AND row_status = 1 );
优化建议:创建(service_code, row_status)复合索引,子查询可以快速定位不符合条件的记录。
方法三:左连接排除法
通过左连接关联row_status=1的记录,筛选未匹配上的service_code:
SELECT DISTINCT d.service_code FROM disp d LEFT JOIN disp d1 ON d.service_code = d1.service_code AND d1.row_status = 1 WHERE d1.service_code IS NULL;
原查询错误原因
原查询逻辑完全偏离需求:它先筛选出row_status=1的service_code存入临时表,后续的关联和NOT IN操作没有实现“排除存在row_status=1的service_code”的逻辑,反而错误地包含了所有相关记录,最终返回了不符合条件的A、B。
内容的提问来源于stack exchange,提问作者Ankita Biswas
相关产品推荐
相关产品推荐

