如何编写MS SQL查询筛选符合特定状态条件的Table A记录?
满足需求的MS SQL查询语句
现有数据表
Table A
ItemNo Name 1 Item1 2 Item2 3 Item3 4 Item4
Table B
ItemNo Status 1 available 1 onhold 1 Sold 1 Transit ------------------ 2 available 2 onhold 2 Sold ----------------- 3 Transit ----------------- 4 onhold
Table B包含四种状态:onhold、available、sold、Transit。
需求说明
仅获取Table A中在Table B里对应ItemNo存在available或Transit状态的记录。
预期输出
ItemNo Name 1 Item1 2 Item2 3 Item3
查询语句
以下几种方式均可实现需求:
方式一:IN子查询
SELECT a.ItemNo, a.Name FROM TableA a WHERE a.ItemNo IN ( SELECT DISTINCT b.ItemNo FROM TableB b WHERE b.Status IN ('available', 'Transit') );
方式二:JOIN + DISTINCT
SELECT DISTINCT a.ItemNo, a.Name FROM TableA a JOIN TableB b ON a.ItemNo = b.ItemNo WHERE b.Status IN ('available', 'Transit');
方式三:EXISTS子查询
SELECT a.ItemNo, a.Name FROM TableA a WHERE EXISTS ( SELECT 1 FROM TableB b WHERE b.ItemNo = a.ItemNo AND b.Status IN ('available', 'Transit') );
补充说明
- 三种方式核心逻辑一致:先过滤出Table B中状态符合要求的ItemNo,再匹配Table A的对应记录。
DISTINCT用于避免Table B中同一ItemNo对应多条符合条件的状态时,Table A记录被重复返回(若业务无重复风险可省略)。EXISTS方式在数据量较大时性能更优,因为它找到匹配项后就停止检索,无需返回所有符合条件的行。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

