如何在单条SQL中嵌套两个SELECT为初始查询提供IN条件值
问题解答
完全可以在单条SQL语句中完成全部逻辑,无需拆分查询或修改上层业务代码,以下是两种可直接落地的实现方式:
方案1:嵌套子查询直接写入IN条件
这是改动量最小的实现方式,直接将后两段查询按依赖逻辑嵌套进IN子句即可,数据库会自动按依赖顺序执行子查询拿到所需整数列表,再完成主查询的结果过滤:
select tester as TESTNAME, testing as TESTNAMETWO, test as TESTNAMETHREE from DATABASE.table master inner join DATABASETWO.table2 notmaster on master.column = notmaster.column2 where master.number = 55555 and notmaster.column3 in ( select valuesNeeded as listofvalues from THEOTHERDB.TABLE bar where bar.value in ( select secondValue as identifier from THEDB.THETABLE foo where foo.id = 55555 ) )
提示:如果
THEDB.THETABLE中id=55555对应的secondValue是唯一值,内层子查询的in可以替换为=,执行效果完全一致。
方案2:通过JOIN关联替代IN子查询
如果涉及的数据量较大,JOIN实现在多数数据库引擎中的执行效率会高于嵌套IN子查询,逻辑是先关联两张提供过滤值的表拿到目标值列表,再和主查询的表做关联过滤:
select distinct tester as TESTNAME, testing as TESTNAMETWO, test as TESTNAMETHREE from DATABASE.table master inner join DATABASETWO.table2 notmaster on master.column = notmaster.column2 inner join THEOTHERDB.TABLE bar on notmaster.column3 = bar.valuesNeeded inner join THEDB.THETABLE foo on bar.value = foo.secondValue where master.number = 55555 and foo.id = 55555
提示:语句中加
distinct是为了避免关联时过滤值表存在重复匹配记录,导致主查询结果出现重复行;如果确认valuesNeeded关联后不会产生重复数据,可以去掉distinct。
通用注意事项
- 上述两种写法均兼容支持标准SQL的主流数据库(MySQL、PostgreSQL、SQL Server、Oracle等),不需要额外语法扩展
- 如果中间查询可能返回NULL值,建议在对应子查询中增加
secondValue is not null、valuesNeeded is not null过滤条件,避免IN子句遇到NULL值时出现逻辑判断异常
内容的提问来源于stack exchange,提问作者Lenny
相关产品推荐
相关产品推荐

