【问题标题】:Using subselect to accomplish LEFT JOIN使用 subselect 完成 LEFT JOIN
【发布时间】:2023-04-03 15:17:01
【问题描述】:

在需要多列的情况下,可以使用子选择完成相当于 LEFT JOIN 的操作。 这就是我的意思。

SELECT m.*, (SELECT * FROM model WHERE id = m.id LIMIT 1) AS models FROM make m

就目前而言,这样做会给我一个“操作数应包含 1 列”错误。

是的,我知道使用 LEFT JOIN 可以做到这一点,但有人告诉我,使用 subselect 可以做到这一点,我很好奇它是如何完成的。

【问题讨论】:

    标签: sql subquery multiple-columns


    【解决方案1】:

    您的建议有很多实际用途。

    对于任何至少有一个release_date 的品牌,这个假设的查询将返回最近的release_date(人为的例子),对于没有release_date 的任何品牌,返回null:

    SELECT m.make_name, 
           sub.max_release_date
      FROM make m
           LEFT JOIN 
               (SELECT id, 
                       max(release_date) as max_release_date
                  FROM make 
               GROUP BY 1) sub
           ON sub.id = m.id
    

    【讨论】:

      【解决方案2】:

      一个子选择只能从它返回一列,因此对于希望从模型表返回的每一列,您需要一个子选择。

      【讨论】:

      • 我确实可以在子选择中返回多列,尽管不是我想要的方式。此查询返回多个列。 SELECT m.*, models.* FROM make m, (SELECT * FROM model LIMIT 1) AS models
      • 子查询可以从 FROM 和 JOIN 返回多于一列,因为您在该上下文中处理行。由于您只在 SELECT 上下文中使用标量,因此您只能从那里的子查询返回一个值。
      猜你喜欢
      • 2012-06-22
      • 2016-01-04
      • 2012-08-17
      • 1970-01-01
      • 2013-03-09
      • 2021-06-25
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多