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

如何修改嵌套SQL查询以实现指定条件的正确数据筛选?

修改嵌套SQL查询以匹配原语句结果

原始数据表 #TEMP_TABLE

序列号ORIGDEST
12345CANYOW
67890YYZPEK
13579PEKYVR
24680PVGYOW
15764YVRXIY
24863CTUPVG

原正确查询语句

通过以下SQL可得到预期结果:

SELECT * FROM #TEMP_TABLE
WHERE
(ORIG IN ('PEK','PVG') AND LEFT(DEST,1)<>'Y')
OR
(ORIG NOT IN ('PEK','PVG') AND LEFT(ORIG,1)<>'Y')
OR
(ORIG NOT IN ('PEK','PVG') AND LEFT(ORIG,1)='Y' AND DEST NOT IN ('PEK','PVG'));

预期结果

序列号ORIGDEST
12345CANYOW
15764YVRXIY
24863CTUPVG

错误的嵌套查询尝试

尝试用嵌套查询实现,但结果不符:

SELECT * FROM #TEMP_TABLE
WHERE
(ORIG IN ('PEK','PVG') AND LEFT(DEST,1)<>'Y')
OR
(ORIG NOT IN ('PEK','PVG') AND DEST IN
    (SELECT DEST FROM #TEMP_TABLE
        WHERE LEFT(ORIG,1)='Y' AND DEST NOT IN ('PEK','PVG'))
);

错误查询结果

序列号ORIGDEST
15764YVRXIY

修改后的嵌套查询

问题出在你的嵌套查询只覆盖了原条件的第三分支,漏掉了第二分支(ORIG不在PEK/PVG且ORIG首字母非Y的情况),同时子查询里的LEFT(ORIG,1)='Y'属于多余判断。调整后的语句如下:

SELECT * FROM #TEMP_TABLE
WHERE
-- 分支1:ORIG为PEK/PVG,且DEST首字母不是Y
(ORIG IN ('PEK','PVG') AND LEFT(DEST,1)<>'Y')
OR
-- 分支2:ORIG不在PEK/PVG,且ORIG首字母不是Y
(ORIG NOT IN ('PEK','PVG') AND LEFT(ORIG,1)<>'Y')
OR
-- 分支3:ORIG不在PEK/PVG、首字母是Y,且DEST不在PEK/PVG
(ORIG NOT IN ('PEK','PVG') AND LEFT(ORIG,1)='Y' 
 AND DEST IN (SELECT DEST FROM #TEMP_TABLE WHERE DEST NOT IN ('PEK','PVG')));

这个语句完全对应原查询的三个逻辑分支,既保留了嵌套查询的写法,又能得到和原语句一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:48:32