在需要多列的情况下,可以通过子选择完成与 LEFT JOIN 等效的操作。 这就是我的意思。
SELECT m.*, (SELECT * FROM model WHERE id = m.id LIMIT 1) AS models FROM make m
现在这样做会给我一个“操作数应包含 1 列”错误。
是的,我知道这可以通过 LEFT JOIN 实现,但有人告诉我可以通过子选择实现,我很好奇它是如何完成的。
您的建议有很多实际用途。
这个假设的查询将为任何至少有一个
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
子选择只能返回一列,因此您需要为要从模型表返回的每一列创建一个子选择。
超级迟到的答案,但值得补充的是横向连接(又名在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
表;横向连接只是一种选择