具有两列作为同一表外键的SQL查询

具有两列作为同一表外键的SQL查询,sql,Sql,我有两张桌子 表A id ! name ! fk_1_table_B_1 ! fk_2_table_B_2 -------|------|----------------|-------------- 1 | John | 1 | 3 2 | Paul | 2 | 1 3 | Anna | 4 | 2 4 | Alan ! 3 | 1 表B

我有两张桌子

表A

    id ! name ! fk_1_table_B_1 ! fk_2_table_B_2
-------|------|----------------|--------------
    1  | John | 1              | 3
    2  | Paul | 2              | 1
    3  | Anna | 4              | 2
    4  | Alan ! 3              | 1
表B

    id | code
-------|------
    1  | EN
    2  | US
    3  | FR
    4  | IT
这样做的目的是获得以下查询

    id ! name ! code (fk_1_table_B_1) ! code (fk_1_table_B_2)
-------!------!-----------------------!-----------------
    1  | John | EN                    | FR
    2  | Paul | US                    | EN
    3  | Anna | IT                    | US
    4  | Alan ! FR                    | EN
如果表A只有表B中的一个FK列,我会这样做

SELECT tableA, name, tableB.code 
FROM tableA, table B
WHERE tableA.fk_1_table_B_1 = tableB.id
对于表A有两列作为FK和B,我如何才能做到这一点?我应该在选择中选择什么


谢谢

您应该加入同一个表两次,给它两个不同的别名:

SELECT a.id, a.name, b1.code, b2.code
FROM tableA a
JOIN tableB b1 ON b1.id = a.fk_1_table_B_1
JOIN tableB b2 ON b2.id = a.fk_2_table_B_2
请注意此查询如何使用ANSI join语法以提高清晰度:它不是在
FROM
子句中列出所有表,而是将每个别名
tableB
s放在自己的
join
子句中。

可能是这样吗

select a.id, a.name,
(select b.code from B b where b.id = a.fk_1_table_B_1),
(select c.code from B c where c.id = a.fk_1_table_B_2),
 from A a

一般来说,最好养成这样使用完全连接语法的习惯。即使您不必这样做,它也可以帮助您了解表是如何链接在一起的。对于此类查询,您必须使用
ON
子句,并且如果没有
ON