合并3个表格以显示所有行

问题描述

我正在尝试编写一个MySQL查询,该查询将如下所述连接所有3个表...

我的桌子:

clients
| client_id | first_name | award_id | country_id |
| 1         | jon        | 3        | 2          |
| 2         | gary       | 5        | 4          |
| 3         | ted        | 1        | 2          |
| 4         | liz        | 3        | 5          |
| 5         | bill       | 1        | 5          |

awards
| award_id | award_name |
| 1        | award_1    |
| 2        | award_2    |
| 3        | award_3    |
| 4        | award_4    |
| 5        | award_5    |
| 6        | award_6    |

countries
| country_id | country_name |
| 1          | England      |
| 2          | Ireland      |
| 3          | USA          |
| 4          | France       |
| 5          | Finland      |
| 6          | Holland      |
| 7          | Germany      |
| 8          | Spain        |

我想要的输出

query_results
| client_id | first_name | award_id | country_id | award_id | award_name | country_id | country_name |
| 1         | jon        | 3        | 2          | 3        | award_3    | 2          | Ireland      |
| 2         | gary       | 5        | 4          | 5        | award_5    | 4          | France       |
| 3         | ted        | 1        | 2          | 1        | award_1    | 2          | Ireland      |
| 4         | liz        | 3        | 5          | 3        | award_3    | 5          | Finland      |
| 5         | bill       | 1        | 5          | 1        | award_1    | 5          | Finland      |
| null      | null       | null     | null       | 2        | award_2    | null       | null         |
| null      | null       | null     | null       | 4        | award_4    | null       | null         |
| null      | null       | null     | null       | 6        | award_6    | null       | null         |
| null      | null       | null     | null       | null     | null       | 1          | England      |
| null      | null       | null     | null       | null     | null       | 3          | USA          |
| null      | null       | null     | null       | null     | null       | 6          | Holland      |
| null      | null       | null     | null       | null     | null       | 7          | Germany      |
| null      | null       | null     | null       | null     | null       | 8          | Spain        |

我一直在尝试将这些与以下查询结合起来...

SELECT * FROM clients
LEFT JOIN countries ON clients.award_id = awards.award_id 
UNION ALL
SELECT * FROM clients
RIGHT JOIN awards ON clients.award_id = awards.award_id 
UNION ALL
SELECT * FROM clients
LEFT JOIN countries ON clients.country_id = countries.countries_id 
UNION ALL
SELECT * FROM clients
RIGHT JOIN countries ON clients.country_id = countries.countries_id

查询失败,错误代码为1222。但是第一个UNION有效,但第三个失败。 任何帮助将不胜感激

解决方法

多个查询的联合具有从每个查询返回的相同列数。您可以通过添加每个查询中不存在的列的null值来做到这一点。

SELECT * 
FROM clients c
LEFT JOIN awards a ON c.award_id = a.award_id
LEFT JOIN countries cs ON c.country_id = cs.country_id

UNION ALL

SELECT NULL,NULL,a1.award_id,a1.award_name,null
FROM awards a1

UNION ALL 

SELECT NULL,c1.country_id,c1.country_name
FROM countries c1
,

这里不需要使用UNION,因为在所有3个表中都需要匹配和不匹配的数据时,请在2个表上首先使用FULL OUTER JOIN,然后使用该查询的结果与FULL OUTER再次与第三个表联接由于所需的输出具有匹配行和不匹配行,因此需要加入。 代码:

SELECT pop.client_id,pop.first_name,pop.award_id,pop.country_id,c.award_id,c.award_name,pop.countryid,pop.countryname 
FROM   (SELECT a.client_id,a.first_name,a.award_id,a.country_id,b.country_id   AS countryid,b.country_name AS countryname 
        FROM   clients a 
               FULL OUTER JOIN countries b 
                            ON a.country_id = b.country_id) pop 
       FULL OUTER JOIN awards c 
                    ON c.award_id = pop.award_id 
ORDER  BY client_id,award_name nulls last;