使用AND子句匹配多行的SQL查询问题求助
解决方案:仅当两个行条件同时满足时返回匹配行
问题根源
你当前的查询逻辑存在核心问题:
- 用
AND连接条件时,单条记录的DOB不可能同时等于两个不同日期,因此无结果返回 - 用
OR连接时,只要有一条记录匹配就会返回,无法保证两个目标条件对应的行都存在
可行解决方法
方法1:窗口函数统计匹配记录数
通过窗口函数计算当前ID下满足目标条件的记录总数,仅当总数为2(即两个日期的记录都存在)时返回结果:
SELECT ID, DOB FROM ( SELECT ID, DOB, COUNT(*) OVER (PARTITION BY ID) AS match_count FROM SINGLE_COL_MULTI_COND WHERE ID = 111 AND DOB IN (DATE '2023-01-01', DATE '2024-05-01') ) t WHERE match_count = 2;
方法2:EXISTS子查询验证双条件存在
分别检查两个目标日期的记录是否都存在,只有两者都满足时才返回匹配行:
SELECT ID, DOB FROM SINGLE_COL_MULTI_COND WHERE ID = 111 AND DOB IN (DATE '2023-01-01', DATE '2024-05-01') AND EXISTS (SELECT 1 FROM SINGLE_COL_MULTI_COND WHERE ID = 111 AND DOB = DATE '2023-01-01') AND EXISTS (SELECT 1 FROM SINGLE_COL_MULTI_COND WHERE ID = 111 AND DOB = DATE '2024-05-01');
方法3:GROUP BY + HAVING筛选合格ID
先筛选出满足任一条件的记录,按ID分组后确认该ID包含两个目标日期,再关联原表获取具体行:
SELECT scmc.ID, scmc.DOB FROM SINGLE_COL_MULTI_COND scmc JOIN ( SELECT ID FROM SINGLE_COL_MULTI_COND WHERE ID = 111 AND DOB IN (DATE '2023-01-01', DATE '2024-05-01') GROUP BY ID HAVING COUNT(DISTINCT DOB) = 2 ) t ON scmc.ID = t.ID WHERE scmc.DOB IN (DATE '2023-01-01', DATE '2024-05-01');
效果验证
- 当两个日期的记录都存在时,三种方法都会返回两行数据
- 若其中一个日期的记录不存在,三种方法都不会返回任何结果,完全符合你的需求
内容的提问来源于stack exchange,提问作者Harrison
相关产品推荐
相关产品推荐

