如何修改嵌套SQL查询以实现指定条件的正确数据筛选?
修改嵌套SQL查询以匹配原语句结果
原始数据表 #TEMP_TABLE
| 序列号 | ORIG | DEST |
|---|---|---|
| 12345 | CAN | YOW |
| 67890 | YYZ | PEK |
| 13579 | PEK | YVR |
| 24680 | PVG | YOW |
| 15764 | YVR | XIY |
| 24863 | CTU | PVG |
原正确查询语句
通过以下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'));
预期结果
| 序列号 | ORIG | DEST |
|---|---|---|
| 12345 | CAN | YOW |
| 15764 | YVR | XIY |
| 24863 | CTU | PVG |
错误的嵌套查询尝试
尝试用嵌套查询实现,但结果不符:
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')) );
错误查询结果
| 序列号 | ORIG | DEST |
|---|---|---|
| 15764 | YVR | XIY |
修改后的嵌套查询
问题出在你的嵌套查询只覆盖了原条件的第三分支,漏掉了第二分支(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
相关产品推荐
相关产品推荐

