首页 > 解决方案 > 左连接有什么问题?

问题描述

我正在使用 postgres,我正在尝试使用左连接来连接两个表。我希望包含左侧的所有列和右侧的所有列。

SELECT * FROM table1 a
LEFT JOIN table2 b on
a.id = b.id;

当我运行它时,没有新列,只有 table1 中的列在表中。我无法弄清楚出了什么问题。我也尝试进行外部连接,但 table1 中仍然没有新列。

这是我想做的一个例子:


tabel1:
+------------+---------------+--------------+
| id         | COMPANY_NAME  | COMPANY_CITY |
+------------+---------------+--------------+
| 18         | Order All     | Boston       |
| 15         | Jack Hill Ltd | London       |
| 16         | Akas Foods    | Delhi        |
| 17         | Foodies.      | London       |
| 19         | sip-n-Bite.   | New York     |
+------------+---------------+--------------+


table2:
+--------------+-----------+
| ITEM_NAME    | id        |
+--------------+-----------+
| Chex Mix     |  16       |
| Cheez-It     |  15       |
| BN Biscuit   |  15       | 
| Mighty Munch |  17       | 
| Pot Rice     |  15       | 
| Jaffa Cakes  |  18       |
| Salt n Shake |           |
+--------------+-----------+

我希望最终结果看起来像:

id         COMPANY_NAME              COMPANY_CITY              ITEM_NAME
---------- ------------------------- ------------------------- ---------- 
16         Akas Foods                Delhi                     Chex Mix
15         Jack Hill Ltd             London                    Cheez-It
15         Jack Hill Ltd             London                    BN Biscuit
17         Foodies.                  London                    Mighty Munch
15         Jack Hill Ltd             London                    Pot Rice
18         Order All                 Boston                    Jaffa Cakes
19         sip-n-Bite.               New York

我还检查以确保不同表中的两个 id 之间存在匹配,并且存在。

我使用 psql 运行查询,输出只是说:

SELECT 2000

然后看看我跑了哪些列

\d table1

这是我要完成的 sql fiddle 的链接:http ://sqlfiddle.com/#!17/96afa/2

标签: postgresqlleft-join

解决方案


我希望包含左侧的所有列和右侧的所有列。

严格来说,你没有。您想要的结果只显示一id列。
您可以使用USING连接中的子句来实现:

SELECT *
FROM   table1 a
LEFT   JOIN table2 b USING (id);

手册:

形式的子句是 AlsoUSING ( a, b, ... )的简写,意味着每对等效列中只有一个将包含在连接输出中,而不是两者都包含。ON left_table.a = right_table.a AND left_table.b = right_table.b ....USING


这是绝对不可能的:

当我运行它时,没有新列,只有 table1 中的列在表中

一定是你的客户端显示有问题。或者其他什么误解。一些客户确实存在重复列名的问题 - 我的查询消除了这一问题。

这将从查询中创建一个新表

CREATE TABLE table3 AS
SELECT *
FROM   table1 a
LEFT   JOIN table2 b USING (id);

推荐阅读