我有两张桌子:A 和 B
一个
provider_id | 日期 |
---|---|
111 | 日期 |
222 | 日期 |
333 | 日期 |
乙
provider_id | 地位 | 日期 |
---|---|---|
111 | 初始化 | 日期 |
111 | 发布 | 日期 |
222 | 失败的 | 日期 |
我想要的结果
provider_id | 地位 | 日期 |
---|---|---|
111 | 发布 | 一个约会 |
222 | 失败的 | 一个约会 |
333 | 无效的 | 一个约会 |
我尝试过的事情之一是左连接
select *
from "A"
left join "B" on "B"."provider_id" = "A"."provider_id"
order by "A"."date" desc;
但我得到了基于重复的记录status
provider_id | 地位 | 日期 |
---|---|---|
111 | 初始化 | 日期 |
111 | 发布 | 日期 |
222 | 失败的 | 日期 |
333 | 无效的 | 日期 |
有很多可能的方法。
最好(最快)的解决方案在很大程度上取决于精确的表定义、典型查询(你到底需要什么?哪些列?所有或几行?过滤方式?排序方式?...),数据库资源,Postgres 版本,索引,最后但并非最不重要的一点是基数和数据分布。
假设您想要所有行,来自具有所有列的大表,
NOT NULL
没有使用 FK 约束强制执行引用完整性,在 中几乎没有重复B (provider_id)
,只有在 上的普通 B-tree 索引(provider_id)
,并且结果应按 排序provider_id
,这将是我的查询:看:
它在任何情况下都有效,但对于其他情况可能会有(很多)更快的查询......