历史表中的 SQL LEFT JOIN

标签 sql postgresql join left-join

我准备了一个 sqlFiddle,位于此处:http://sqlfiddle.com/#!2/951c1/2/1

我有 3 个表(汽车、颜色和 car_color_history)。在 colors 中有我感兴趣的带有某种元数据的颜色。在 cars 中,有一堆带有“wanted_color”键的汽车告诉汽车改变给定的颜色。在 car_color_history 中,有所有的条目,在什么特定时间汽车有什么颜色。

我现在想要的是查看/选择语句,以获取所有汽车的当前想要颜色信息。

我的第一个想法是用左连接和某种 GROUP BY 魔术来做到这一点,但直到现在,我还无法让它工作

一个可行的解决方案是带有子选择的 fiddle 中的第二个选择。我是否正确认为这不是一个很好的解决方案,因为它很慢?另外,我必须为每个显示的列提供子选择:(

谁有解决办法?

最佳答案

SQL Fiddle

select
    ca.carkey,
    description,
    cow.other_info as wanted_color,
    cco.other_info as current_color,
    cch.datetime as current_color_datetime
from
    cars ca
    left join
    colors cow on ca.wanted_color = cow.colorkey
    left join (
        select distinct on (carkey) *
        from car_color_history
        order by carkey, datetime desc
    ) cch using(carkey)
    left join
    colors cco on cch.colorkey = cco.colorkey

关于历史表中的 SQL LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25162419/

相关文章:

java - Spring boot data.sql没有初始化Postgresql中的数据

python - 在正确的位置加入带有标点符号的拆分词和标点符号

sql - sql中逗号和join的区别

php - 如何简化脚本

SQL查询选择优化

postgresql - pg_dump postgresql 9.5 上目录丢失错误

sql - 我不明白 postgresql 的 nextval() 是如何工作的,有人可以解释一下吗?

sql - 从单列 MySQL 中的所有行中剥离 0

mysql - 当您只有日期(没有时间部分)时按顺序求和列

mysql - 在这种情况下如何编写连接查询 : 1 if not exist, 不是限制 2 如果存在,则必须在这些时间