使用子选择完成LEFT JOIN

问题描述 投票:0回答:3

在需要多列的情况下,可以通过子选择完成与 LEFT JOIN 等效的操作。 这就是我的意思。

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

现在这样做会给我一个“操作数应包含 1 列”错误。

是的,我知道这可以通过 LEFT JOIN 实现,但有人告诉我可以通过子选择实现,我很好奇它是如何完成的。

sql subquery multiple-columns
3个回答
36
投票

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

这个假设的查询将为任何至少有一个

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

10
投票

子选择只能返回一列,因此您需要为要从模型表返回的每一列创建一个子选择。


0
投票

超级迟到的答案,但值得补充的是横向连接(又名在SQL Server中应用)可能对那些希望从子查询中获取多列的人有帮助,特别是对于需要执行正常连接操作的情况无法处理(例如使用

LIMIT

这是一个 PostgreSQL 示例:

with

make(id, make_name) as (
    values
        (1, 'Toyota'),
        (2, 'Ford'),
        (3, 'Chevrolet')
),
model(id, model_name, price, release_date) as (
    values
        (1, 'Corolla', 10000, '2000-01-01'),
        (1, 'Corolla', 15000, '2010-01-01'),
        (1, 'Camry', 20000, '2020-01-01'),
        (2, 'F-150', 25000, '2000-01-01'),
        (2, 'F-150', 30000, '2015-01-01'),
        (3, 'Silverado', 30000, '2000-01-01')
)

select
    make.id,
    make.make_name,
    models.model_name,
    models.price as current_price
from make
    left join lateral (
        select *
        from model
        where make.id = model.id
        order by release_date desc
        limit 1
    ) as models on 1=1
;

还有其他方法可以获得相同的输出,例如在加入之前过滤

model
表;横向连接只是一种选择

© www.soinside.com 2019 - 2024. All rights reserved.