合并 3 个表以显示所有行

Combine 3 tables to show all rows

我正在尝试编写一个 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 有效但在第三个失败。 非常感谢任何帮助

多个查询的联合在每个查询中具有相同数量的列 returns。您可以通过添加每个查询中不存在的列的 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, NULL, NULL, a1.award_id, a1.award_name, NULL, null
FROM awards a1

UNION ALL 

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

您不需要在这里使用 UNION,因为您需要在所有 3 个 table 中同时匹配和 non-matching 数据,首先在 2 个 table 中使用 FULL OUTER JOIN 并使用该查询的结果与第三个 table 再次使用 FULL OUTER JOIN 连接,因为 Desired Output 具有匹配的 +non-matching 行。 代码:

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;