【问题标题】:SQL LEFT JOIN in history table历史表中的 SQL LEFT JOIN
【发布时间】:2014-08-06 14:01:01
【问题描述】:

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

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

我现在想要的是一个视图/选择语句,以获取所有具有当前想要颜色信息的汽车。

我的第一个想法是使用左连接和某种 GROUP BY 魔法来做到这一点,但到现在为止,我无法让它发挥作用

一个可行的解决方案是使用子选择进行第二次选择。我是否正确,因为它很慢,所以这不是一个很好的解决方案?另外,我必须为每个显示的列提供子选择:(

有人有办法吗?

【问题讨论】:

  • 您使用左联接是否有原因?所有的汽车都应该有颜色,不是吗?内连接将提高您的性能
  • 数字键应该是integer,而不是varchar
  • @ErwinBrandstetter 是的,但我确实在这个简化的示例中使用了 int 键。在我的实际应用程序中,键是字符串 :(

标签: sql postgresql join left-join


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-09-29
    • 2021-05-28
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多