合并 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;
我正在尝试编写一个 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;