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

技术问询:查找仅含register_nr=5且无register_nr=6的unit_nr

筛选仅含register_nr=5的unit_nr解决方案

需求:从符合unit_type=58、input_nr IN (1,2)、有效时间不为空等基础条件的记录中,找出仅拥有register_nr=5的unit_nr,排除同时存在register_nr=6的unit_nr。

方法一:分组聚合筛选

先获取所有符合条件的register_nr=5和6的记录,再通过分组筛选出仅包含5的unit_nr:

WITH unit_registers AS (
    SELECT 
        ami.unit_nr,
        CR.register_nr
    FROM nw_metering_connection@AMIAMI AMI
    LEFT JOIN NW_UNIT_CONFIG NUC ON NUC.UNIT_NR = AMI.UNIT_NR
    LEFT JOIN CFG_REGISTER CR ON CR.CONFIGURATION_ID = NUC.CONFIGURATION_ID
    WHERE 
        ami.unit_type = 58 
        AND ami.input_nr IN (1,2) 
        AND ami.valid_until IS NULL 
        AND nuc.valid_until IS NULL 
        AND CR.REGISTER_TYPE = 8 
        AND CR.register_nr IN (5,6)
)
SELECT 
    ami.unit_type,
    ami.unit_nr, 
    nwmp.metering_point_id,
    CR.register_name 
FROM nw_metering_connection@AMIAMI AMI
LEFT JOIN NW_METERING_POINT@amiami nwmp ON nwmp.internal_metering_point_id = ami.internal_metering_point_id
LEFT JOIN NW_UNIT_CONFIG NUC ON NUC.UNIT_NR = AMI.UNIT_NR
LEFT JOIN CFG_CONFIGURATION CFG ON nuc.configuration_id = CFG.CONFIGURATION_ID
LEFT JOIN CFG_REGISTER CR ON CR.CONFIGURATION_ID = NUC.CONFIGURATION_ID
WHERE 
    ami.unit_type = 58 
    AND ami.input_nr IN (1,2) 
    AND ami.valid_until IS NULL 
    AND nuc.valid_until IS NULL 
    AND CR.REGISTER_TYPE = 8 
    AND CR.register_nr = 5
    AND ami.unit_nr IN (
        SELECT unit_nr 
        FROM unit_registers
        GROUP BY unit_nr
        HAVING COUNT(DISTINCT register_nr) = 1 AND MAX(register_nr) = 5
    );

方法二:用NOT EXISTS直接排除

先筛选出register_nr=5的记录,同时排除存在同unit_nr且register_nr=6的情况,逻辑更直观:

SELECT 
    ami.unit_type,
    ami.unit_nr, 
    nwmp.metering_point_id,
    CR.register_name 
FROM nw_metering_connection@AMIAMI AMI
LEFT JOIN NW_METERING_POINT@amiami nwmp ON nwmp.internal_metering_point_id = ami.internal_metering_point_id
LEFT JOIN NW_UNIT_CONFIG NUC ON NUC.UNIT_NR = AMI.UNIT_NR
LEFT JOIN CFG_CONFIGURATION CFG ON nuc.configuration_id = CFG.CONFIGURATION_ID
LEFT JOIN CFG_REGISTER CR ON CR.CONFIGURATION_ID = NUC.CONFIGURATION_ID
WHERE 
    ami.unit_type = 58 
    AND ami.input_nr IN (1,2) 
    AND ami.valid_until IS NULL 
    AND nuc.valid_until IS NULL 
    AND CR.REGISTER_TYPE = 8 
    AND CR.register_nr = 5
    AND NOT EXISTS (
        SELECT 1
        FROM nw_metering_connection@AMIAMI AMI_sub
        JOIN NW_UNIT_CONFIG NUC_sub ON NUC_sub.UNIT_NR = AMI_sub.UNIT_NR
        JOIN CFG_REGISTER CR_sub ON CR_sub.CONFIGURATION_ID = NUC_sub.CONFIGURATION_ID
        WHERE 
            AMI_sub.unit_nr = AMI.unit_nr
            AND AMI_sub.unit_type = 58
            AND AMI_sub.input_nr IN (1,2)
            AND AMI_sub.valid_until IS NULL
            AND NUC_sub.valid_until IS NULL
            AND CR_sub.REGISTER_TYPE = 8
            AND CR_sub.register_nr = 6
    );

两种方法都能满足需求,NOT EXISTS的写法在多数数据库中性能更优,建议优先使用,前提是相关字段(如unit_nr、register_nr)有合适的索引。

内容的提问来源于stack exchange,提问作者xgamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:50:43