SQL 查询结果来自 2 个表,1 个表多次

时间:2021-05-27 15:33:22

标签: sql-server

我在 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

有人可以告诉我哪里出错了吗?

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;