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

如何从单表提取匹配行与不匹配行?需创建两个存储过程

解决方案:创建匹配行与不匹配行的存储过程

我来帮你搞定这两个存储过程,思路其实很清晰,咱们一步步来:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:23:47