多表关联查询需求:按状态优先级筛选Table2数据返回结果
解决方案:按优先级筛选关联表记录
没问题,我来帮你搞定这个查询需求!根据你的要求,我们需要优先获取每个id对应的status=1的Table2记录,没有的话取status=2的,两者都没有则跳过该id,同时关联Table1和Table3的对应字段。
实现思路
利用窗口函数ROW_NUMBER()为每个id的Table2记录按优先级排序:
- 给status=1的记录分配最高优先级(排序值为1)
- 其次是status=2的记录(排序值为2)
- 其他status的记录排序值大于2,后续会被过滤掉
之后筛选出每个id中排序值为1的记录,再关联Table1和Table3即可得到目标结果。
完整SQL查询语句
WITH ranked_table2 AS ( SELECT id, status, date, ROW_NUMBER() OVER ( PARTITION BY id ORDER BY CASE status WHEN 1 THEN 1 WHEN 2 THEN 2 ELSE 3 END ) AS rn FROM Table2 WHERE status IN (1, 2) -- 只保留需要考虑的status值 ) SELECT t1.name, rt2.status, rt2.date, t3.value FROM ranked_table2 rt2 JOIN Table1 t1 ON rt2.id = t1.id JOIN Table3 t3 ON rt2.id = t3.id WHERE rt2.rn = 1; -- 取每个id优先级最高的记录
查询结果验证
根据你提供的测试数据,执行上述查询后会得到如下结果:
| name | status | date | value |
|---|---|---|---|
| A | 1 | '.11..' | 34 |
| C | 1 | '.31..' | 17 |
解释一下结果:
- id=1有status=1的记录,所以取这条
- id=2既没有status=1也没有status=2的记录,所以被跳过
- id=3有status=1的记录,所以取这条
如果后续有id存在status=2但没有status=1的情况(比如新增id=4,Table2里只有status=2的记录),该查询也会正确返回这条status=2的记录。
内容的提问来源于stack exchange,提问作者Mazinfriki
相关产品推荐
相关产品推荐

