我在 SQL 表中有以下数据。
表一
id | 名称 |
---|---|
1 | 约翰 |
2 | 史密斯 |
3 | 珍妮 |
4 | 比尔 |
表 2
_id | value | value_id |
---|---|---|
1 | 纽约 | 1 |
2 | 伦敦 | 1 |
3 | 芝加哥 | 1 |
1 | 拉斯维加斯 | 2 |
3 | 亚特兰大 | 2 |
4 | 坦帕湾 | 2 |
4 | 巴黎 | 1 |
我要展示的结果是这样的。
id | 名称 | city_1 | city_2 |
---|---|---|---|
1 | 约翰 | 纽约 | 拉斯维加斯 |
2 | 史密斯 | 伦敦 | NULL |
3 | 珍妮 | 芝加哥 | 亚特兰大 |
4 | 比尔 | 坦帕湾 | 巴黎 |
但我得到的结果是,第 2 行缺失。
id | 名称 | city_1 | city_2 |
---|---|---|---|
1 | 约翰 | 纽约 | 拉斯维加斯 |
3 | 珍妮 | 芝加哥 | 亚特兰大 |
4 | 比尔 | 坦帕湾 | 巴黎 |
我使用的代码是这样的。
SELECT
a.id,
a.name,
b.value AS city_1,
c.value AS city_2
FROM table1 AS a
JOIN table2 AS b ON a.id=b._id
JOIN table2 AS c ON a.id=c._id
WHERE b.value_id=1 and c.value_id=2
有人可以告诉我哪里出错了吗?
答案 0 :(得分:3)
差不多了,但您需要做一些更改:
select a.id,a.name, b.value as city_1, c.value as city_2
from table1 as a
left join table2 as b on a.id=b._id and b.value_id=1
left join table2 as c on a.id=c._id and c.value_id=2
基本上,使用左连接是因为您在另一个表中并不总是有匹配的记录,但您希望显示第一个表中的所有行。
将条件从 where 子句移动到连接中的 on 子句可确保在连接期间应用条件,而不是过滤连接的结果。如果我们将 where 子句与 left join 一起使用,您仍然会看到与现在相同的结果,因为 where 将在 join 之后进行评估。
答案 1 :(得分:1)
另一个答案的问题是多个连接到同一个表。您可以使用单个连接和条件聚合(也称为 PIVOT
)
select
a.id,
a.name,
max(case when b.value_id = 1 then b.value end) as city_1,
max(case when b.value_id = 2 then b.value end) as city_2
from table1 as a
left join table2 as b on a.id = b._id
group by
a.id,
a.name;