SQL脚本执行报错,如何修改使其返回'Problem'或'OK'?
解决你的SQL脚本问题
嘿,我来帮你搞定这个SQL脚本的问题~ 首先得指出原脚本的核心问题:你把创建临时表、查询、删除表这多个批处理语句塞进了SELECT ... FROM ()的子查询里,这在SQL里是不允许的——子查询必须是单一的SELECT结果集,不能包含这类DDL(数据定义语言)操作。
接下来给你两种修改方案,都能实现“有符合条件的数据返回'Problem',无则返回'OK'”的需求:
方案1:无需临时表,用EXISTS高效判断
这个方案最简洁,性能也更好(因为EXISTS只要找到一条符合条件的记录就会停止查询):
SELECT CASE WHEN EXISTS ( -- 检查是否存在同一个计费代码对应多个产品子类型的情况 SELECT 1 FROM TOfferingBase GROUP BY PBillingCode HAVING COUNT(DISTINCT OfferingSubTypeID) >= 2 ) THEN 'Problem' ELSE 'OK' END AS durum
逻辑说明:
- 内层的
GROUP BY PBillingCode按计费代码分组,COUNT(DISTINCT OfferingSubTypeID) >=2表示同一个计费代码关联了至少2种不同的产品子类型,也就是你说的“同时用于多产品和单产品”。 - 外层用
CASE判断是否存在这样的计费代码,返回对应的结果。
方案2:保留临时表(适合复杂逻辑场景)
如果你因为某些原因一定要用临时表,那得把操作拆成独立的批处理步骤,不能嵌套在子查询里:
-- 第一步:创建临时表,存储按产品子类型+计费代码分组后的结果 SELECT PBillingCode, OfferingSubTypeID INTO #Coklu_Basit_Sunu FROM TOfferingBase GROUP BY OfferingSubTypeID, PBillingCode; -- 第二步:判断是否存在符合条件的记录并返回结果 SELECT CASE WHEN EXISTS ( SELECT PBillingCode FROM #Coklu_Basit_Sunu GROUP BY PBillingCode HAVING COUNT(PBillingCode) >= 2 ) THEN 'Problem' ELSE 'OK' END AS durum; -- 第三步:清理临时表 DROP TABLE #Coklu_Basit_Sunu;
逻辑说明:
- 先把分组结果存入临时表,再对临时表的计费代码分组,统计出现次数≥2的记录(也就是对应多个产品子类型的计费代码)。
- 最后用
CASE判断是否存在这类记录,返回结果后删除临时表。
两种方案都能满足你的需求,推荐方案1,更简洁高效~
内容的提问来源于stack exchange,提问作者Mert Celebi
相关产品推荐
相关产品推荐

