You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询所有业务单元下row_status均为0的service_code

解决SQL查询:获取所有关联business_unit_id的row_status全为0的service_code

有一张名为disp的表,包含service_code、row_status、business_unit_id三列,表中数据如下:

service_coderow_statusbusiness_unit_id
A1BU1
A0BU2
A0BU3
B1BU1
B0BU2
C0BU2
C0BU3

需求是编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:43:16