如何从单表提取匹配行与不匹配行?需创建两个存储过程
解决方案:创建匹配行与不匹配行的存储过程
我来帮你搞定这两个存储过程,思路其实很清晰,咱们一步步来:
1. 获取“匹配行”的存储过程
咱们的目标是找出那些在同一组uID、aID、cID、pID下,同时存在state=1和state=2的所有行。我用CTE(公共表表达式)先筛选出符合条件的ID组合,再关联原表取数据,可读性会更好:
CREATE PROCEDURE GetMatchingRows AS BEGIN SET NOCOUNT ON; -- 先筛选出同时拥有state=1和state=2的ID组合 WITH ValidIDGroups AS ( SELECT uID, aID, cID, pID FROM YourTableName WHERE state IN (1, 2) GROUP BY uID, aID, cID, pID HAVING COUNT(DISTINCT state) = 2 ) -- 关联原表获取所有符合条件的行 SELECT t.* FROM YourTableName t JOIN ValidIDGroups g ON t.uID = g.uID AND t.aID = g.aID AND t.cID = g.cID AND t.pID = g.pID WHERE t.state IN (1, 2); END;
这个逻辑的核心是:先锁定那些同时包含两种状态的ID组合,再把这些组合对应的所有行(不管是state1还是2)都拉出来,就是你要的“匹配行”。
2. 获取“不匹配行”的存储过程
接下来是找state=1但没有对应state=2的行,用NOT EXISTS子查询就能直观实现这个需求:
CREATE PROCEDURE GetNonMatchingRows AS BEGIN SET NOCOUNT ON; SELECT t.* FROM YourTableName t WHERE t.state = 1 AND NOT EXISTS ( SELECT 1 FROM YourTableName t2 WHERE t2.uID = t.uID AND t2.aID = t.aID AND t2.cID = t.cID AND t2.pID = t.pID AND t2.state = 2 ); END;
这里的逻辑很直接:先挑出所有state=1的行,然后排除掉那些同一ID组合下存在state=2的记录,剩下的就是“不匹配行”了。
注意事项
记得把代码里的YourTableName替换成你实际使用的数据表名称。如果是MySQL数据库,存储过程的语法会略有不同(比如不需要SET NOCOUNT ON;,创建时要注意分隔符设置),如果需要适配其他数据库类型,可以随时告诉我调整。
内容的提问来源于stack exchange,提问作者MrLister
相关产品推荐
相关产品推荐

