如何获取同表同字段关联无重复行数据?多表关联查询求助
解决两个数据库关联问题
一、三张表关联获取匹配数据
咱们先拆解第一个需求:T1要通过otId关联T3中FORMFLAG为OT的记录,拿到对应ITEM;T2要通过pmId关联T3中FORMFLAG为PM的记录,拿到对应ITEM;最后按T1/T2的Id把这两部分数据整合起来。
根据你给的示例数据,用多表连接+表别名就能实现,具体SQL如下:
SELECT t1.Id AS ID, t3_ot.ITEM AS OT, t3_pm.ITEM AS PM FROM T1 -- 关联T3筛选出OT类型的ITEM JOIN T3 t3_ot ON t1.otId = t3_ot.Id AND t3_ot.FORMFLAG = 'OT' -- 关联T2,确保和T1的Id一一对应 JOIN T2 ON t1.Id = t2.Id -- 关联T3筛选出PM类型的ITEM JOIN T3 t3_pm ON t2.pmId = t3_pm.Id AND t3_pm.FORMFLAG = 'PM';
执行后得到的结果应该是:
| ID | OT | PM |
|---|---|---|
| 1 | DI | C |
| 2 | PU | DC |
| 3 | D | OT |
注:你给出的期望输出里部分PM值和数据逻辑不符,应该是笔误,你可以根据实际业务调整关联条件或筛选规则。
二、同表同字段关联且无重复行的数据获取
自关联最容易踩的坑就是出现重复行(比如A关联B和B关联A,逻辑相同但记录重复)。要避免这种情况,核心思路是通过唯一标识的大小限制,只保留单向关联的记录。
举个实际例子,假设你有一张表A,结构和数据如下:
| Id | col1 |
|---|---|
| 1 | 10 |
| 2 | 10 |
| 3 | 20 |
| 4 | 20 |
如果要获取col1相同的关联数据且无重复,SQL可以这么写:
SELECT a.Id AS a_id, a.col1, b.Id AS b_id FROM A a JOIN A b ON a.col1 = b.col1 -- 只保留a.Id小于b.Id的组合,彻底避免双向重复 AND a.Id < b.Id;
执行后得到的结果是:
| a_id | col1 | b_id |
|---|---|---|
| 1 | 10 | 2 |
| 3 | 20 | 4 |
这样就不会出现(2,1)或(4,3)这类重复的关联行,保证结果唯一且符合需求。
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

