SQL:组合表的查询

SQL:组合表的查询,sql,join,Sql,Join,我有以下MySQL表: 表A: 表B: 表C: 表D: 表A中的类型字段引用了另一个表: 0 -> B 1 -> C 2 -> D t_id是指该特定表中的id 现在,我正在寻找一个能给出以下结果的查询: id type t_id b c d --------------------------------- 1 0 1 ba - - 2 0 2 bb - - 3

我有以下MySQL表:

表A:

表B:

表C:

表D:

表A中的类型字段引用了另一个表:

0 -> B
1 -> C
2 -> D
t_id是指该特定表中的id

现在,我正在寻找一个能给出以下结果的查询:

id    type  t_id  b     c     d
---------------------------------
1      0      1   ba    -     -
2      0      2   bb    -     -
3      0      3   bc    -     -
4      0      4   bd    -     -
5      0      5   be    -     -
6      1      1   -     ca    -
7      1      2   -     cb    -
8      1      3   -     cc    -
9      1      4   -     cd    -
10     1      5   -     ce    -
11     2      1   -     -     da
12     2      2   -     -     db
13     2      3   -     -     dc
14     2      4   -     -     dd
15     2      5   -     -     de

-  should be an empty field.

这在MySQL中可能吗?

另一个替代解决方案是使用
左连接

SELECT A.id, A.type, A.t_id, B.b, NULL AS c, NULL AS d
FROM A JOIN B ON A.t_id = b.id 
WHERE A.type = 0

UNION ALL

SELECT A.id, A.type, A.t_id, NULL, C.c, NULL
FROM A JOIN C ON A.t_id = c.id 
WHERE A.type = 1

UNION ALL

SELECT A.id, A.type, A.t_id, NULL, NULL, D.d
FROM A JOIN D ON A.t_id = d.id 
WHERE A.type = 2;
SELECT  a.*,
        CASE WHEN a.type = 0 THEN b.b ELSE NULL END b,
        CASE WHEN a.type = 1 THEN c.c ELSE NULL END c,
        CASE WHEN a.type = 2 THEN d.d ELSE NULL END d
FROM    tableA a
        LEFT JOIN tableB b
            ON a.t_id = b.id
        LEFT JOIN tableC c
            ON a.t_id = c.id
        LEFT JOIN tableD d
            ON a.t_ID = d.id

另一种替代解决方案是使用
左连接

SELECT  a.*,
        CASE WHEN a.type = 0 THEN b.b ELSE NULL END b,
        CASE WHEN a.type = 1 THEN c.c ELSE NULL END c,
        CASE WHEN a.type = 2 THEN d.d ELSE NULL END d
FROM    tableA a
        LEFT JOIN tableB b
            ON a.t_id = b.id
        LEFT JOIN tableC c
            ON a.t_id = c.id
        LEFT JOIN tableD d
            ON a.t_ID = d.id

嘿,比尔,你写的书非常权威:嘿,比尔,你写的书非常权威:D
id    type  t_id  b     c     d
---------------------------------
1      0      1   ba    -     -
2      0      2   bb    -     -
3      0      3   bc    -     -
4      0      4   bd    -     -
5      0      5   be    -     -
6      1      1   -     ca    -
7      1      2   -     cb    -
8      1      3   -     cc    -
9      1      4   -     cd    -
10     1      5   -     ce    -
11     2      1   -     -     da
12     2      2   -     -     db
13     2      3   -     -     dc
14     2      4   -     -     dd
15     2      5   -     -     de

-  should be an empty field.
SELECT A.id, A.type, A.t_id, B.b, NULL AS c, NULL AS d
FROM A JOIN B ON A.t_id = b.id 
WHERE A.type = 0

UNION ALL

SELECT A.id, A.type, A.t_id, NULL, C.c, NULL
FROM A JOIN C ON A.t_id = c.id 
WHERE A.type = 1

UNION ALL

SELECT A.id, A.type, A.t_id, NULL, NULL, D.d
FROM A JOIN D ON A.t_id = d.id 
WHERE A.type = 2;
SELECT  a.*,
        CASE WHEN a.type = 0 THEN b.b ELSE NULL END b,
        CASE WHEN a.type = 1 THEN c.c ELSE NULL END c,
        CASE WHEN a.type = 2 THEN d.d ELSE NULL END d
FROM    tableA a
        LEFT JOIN tableB b
            ON a.t_id = b.id
        LEFT JOIN tableC c
            ON a.t_id = c.id
        LEFT JOIN tableD d
            ON a.t_ID = d.id