【问题标题】:Why does my LEFT JOIN work when I perform "SELECT * ", but fails when I select only the necessary columns?为什么当我执行“SELECT *”时我的 LEFT JOIN 工作,但当我只选择必要的列时失败?
【发布时间】:2018-02-19 08:45:33
【问题描述】:

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

意味着它未能加入,而是仅显示房屋表。

我的问题

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

有没有办法可以将两个表连接在一起,但也可以从“房屋”表中排除图片列?

谢谢!

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您只能看到来自 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;

    【讨论】:

    • 果然。我想我只是误解了选择查询的工作原理。
    猜你喜欢
    • 2021-12-21
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多