select多次同一列返回duplicated

q8l4jmvw  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(344)

我有以下表格: table1 :

id | idFirst | idLast | value
1  |    1    |   2    |  0
2  |    4    |   5    |  0
3  |    6    |   8    |  1
``` `table1.idFirst` 以及 `table1.idLast` 是 `FK` 指向
table2.id `table2` :

id | level
1 | 123
2 | 124
3 | 125
4 | 126
5 | 127
6 | 128
7 | 129
8 | 130

我想执行一个返回 `table2.level` 在所有的寄存器中 `table1` 哪里 `table1.value==0` . 我的方法如下:

SELECT T1.id
(SELECT T2.level WHERE T1.idFirst=T2.id) AS x1,
(SELECT T2.level WHERE T1.idLast=T2.id) AS x2
FROM table1 T1
INNER JOIN table2 T2 ON T1.idFirst=T2.id OR T1.idLast=T2.id
WHERE table1.value=0
GROUP BY T1.id
ORDER BY T1.id ASC;

此查询的结果具有以下结构:
![](https://i.stack.imgur.com/gzIa2.png)
问题是 `GROUP BY` 没有正确地将寄存器x1和x2分组,因此当列x2的值正确时,x1的结果为null。如果我删除 `GROUP BY` 语句,所有预期的寄存器都被获得,但由于它们没有分组,如下所示:
![](https://i.stack.imgur.com/Tpqx2.png)
因此,我的问题是:如何在不丢失其中一列的所有寄存器的情况下执行此查询?
agyaoht7

agyaoht71#

你必须加入 table1 最多2份 table2 :

select t1.id, 
       t21.level x1,
       t22.level x2
from table1 t1 
inner join table2 t21 on t21.id = t1.idFirst
inner join table2 t22 on t22.id = t1.idLast
where t1.value = 0;

请看演示。
结果:

| id  | x1  | x2  |
| --- | --- | --- |
| 1   | 123 | 124 |
| 2   | 126 | 127 |

相关问题