当我执行“SELECT *”时为什么我的LEFT JOIN工作,但是当我只选择必要的列时失败?

时间:2018-02-19 00:38:18

标签: postgresql

我是SQL的新手,但我正在尝试加入两个表。但是,它没有像我预期的那样工作。这是在Postgresql中。

以下是我要加入的表格。

我的桌子

SELECT * FROM houses;

 id |      name      |   address   | picture
----+----------------+-------------+------------
  1 | House 1        | 440 S 3rd W | long-link2.jpg
  2 | House 2        | 538 S 5th E | long-link.jpg

SELECT house_id, trunc(avg(score), 1) FROM house_reviews GROUP BY house_id;

 house_id | trunc
----------+-------
        1 |   3.0
        2 |   3.0

我的JOIN声明

尝试1(正常)

SELECT * FROM houses
LEFT JOIN (SELECT house_id, trunc(avg(score), 1) FROM house_reviews GROUP BY house_id) AS r
ON houses.id = r.house_id;

尝试2(不起作用)

SELECT id, name, address FROM houses
LEFT JOIN (SELECT house_id, trunc(avg(score), 1) FROM house_reviews GROUP BY house_id) AS r
ON houses.id = r.house_id;

两者之间的唯一区别是我没有在尝试2中选择图片。但是尝试2似乎根本没有加入。而是显示

 id |      name      |   address
----+----------------+-------------
  1 | Tuscany        | 440 S 2nd W
  2 | Mountain Lofts | 538 S 2nd W

意味着它无法加入,而只是显示房屋表。

我的问题

我很困惑为什么第二个表中的连接失败,因为我只删除了一个任意列(图片)。

有没有办法可以将两张桌子连在一起,但也可以从“房屋”表中排除图片栏?

谢谢!

1 个答案:

答案 0 :(得分:2)

您只看到来自houses的数据,因为您已经选择了所有数据。试试这个:

SELECT h.id, h.name, h.address, r.avg_score FROM houses h LEFT JOIN ( SELECT house_id, trunc(avg(score), 1) avg_score FROM house_reviews GROUP BY house_id ) AS r ON houses.id = r.house_id;