我有两张桌子,我想加入他们。下面是表格示例和结果表:
表A
ID | 地点 | R_ID | M_ID |
---|---|---|---|
1 | PLACE_1 | 51 | 53 |
2 | PLACE_2 | 52 | 54 |
B桌
S_ID | 姓名 |
---|---|
51 | A |
52 | 乙 |
53 | C |
54 | D |
输出表
ID | 地点 | R_NAME | M_NAME |
---|---|---|---|
1 | PLACE_1 | A | C |
2 | PLACE_2 | 乙 | D |
我试过查询:
SELECT
id,
place,
name as r_name
FROM
table_a
LEFT JOIN table_b ON r_id = s_id
查询结果
ID | 地点 | R_NAME |
---|---|---|
1 | PLACE_1 | A |
2 | PLACE_2 | 乙 |
但是我不知道如何加入下一专栏m_name.
两次加入同一张表,使用表别名来区分两者:
SELECT id,
place,
r.name as r_name,
m.name as m_name
FROM table_a a
LEFT JOIN table_b r ON a.r_id = r.s_id
LEFT JOIN table_b m ON a.m_id = m.s_id
其中,对于示例数据:
CREATE TABLE Table_A (ID, PLACE, R_ID, M_ID) AS
SELECT 1, 'PLACE_1', 51, 53 FROM DUAL UNION ALL
SELECT 2, 'PLACE_2', 52, 54 FROM DUAL;
CREATE TABLE Table_B (S_ID, NAME) AS
SELECT 51, 'A' FROM DUAL UNION ALL
SELECT 52, 'B' FROM DUAL UNION ALL
SELECT 53, 'C' FROM DUAL UNION ALL
SELECT 54, 'D' FROM DUAL;
输出:
ID | 地点 | R_NAME | M_NAME |
---|---|---|---|
1 | PLACE_1 | A | C |
2 | PLACE_2 | 乙 | D |
你可以这样做:
with cte_r as (
SELECT a.ID, a.PLACE, b.NAME
FROM tableA a
INNER JOIN tableB b on a.R_ID = b.S_ID
),
cte_m as (
SELECT a.ID, a.PLACE, b.NAME
FROM tableA a
INNER JOIN tableB b on a.M_ID = b.S_ID
)
SELECT r.ID, r.PLACE, r.NAME as R_NAME, m.NAME as M_NAME
FROM cte_r r
LEFT JOIN cte_m m on r.ID = m.ID and r.PLACE = m.PLACE
结果:
ID PLACE R_NAME M_NAME
1 PLACE_1 A C
2 PLACE_2 B D
也可以使用子查询:
SELECT a.id,
a.place,
(SELECT name FROM table_b r WHERE a.r_id = r.s_id) AS r_name,
(SELECT name FROM table_b m WHERE a.m_id = m.s_id) AS m_name
FROM table_a a;