SQL 在最大日期离开加入
SQL left join on maximum date
我有两个 table:contracts
和 contract_descriptions
。
在 contract_descriptions
上有一个名为 contract_id
的列,它在 contracts
table 条记录上是相等的。
我正在尝试加入 contract_descriptions
上的最新记录:
SELECT *
FROM contracts c
LEFT JOIN contract_descriptions d ON d.contract_id = c.contract_id
AND d.date_description =
(SELECT MAX(date_description)
FROM contract_descriptions t
WHERE t.contract_id = c.contract_id)
它有效,但它是执行此操作的高效方法吗?有没有办法避免第二个SELECT
?
您也可以使用 DISTINCT ON
:
SELECT * FROM contracts c LEFT JOIN (
SELECT DISTINCT ON (cd.contract_id) cd.* FROM contract_descriptions cd
ORDER BY cd.contract_id, cd.date_description DESC
) d ON d.contract_id = c.contract_id
DISTINCT ON
每个 contract_id
仅选择一行,而排序子句 cd.date_description DESC
确保它始终是最后一个描述。
性能取决于许多值(例如,table 大小)。无论如何,您应该将这两种方法与 EXPLAIN
.
进行比较
我觉得你的查询没问题。一种典型的按顺序从另一行 table 连接 n 行的方法是横向连接:
SELECT *
FROM contracts c
CROSS JOIN LATERAL
(
SELECT *
FROM contract_descriptions cd
WHERE cd.contract_id = c.contract_id
ORDER BY cd.date_description DESC
FETCH FIRST 1 ROW ONLY
) cdlast;
我有两个 table:contracts
和 contract_descriptions
。
在 contract_descriptions
上有一个名为 contract_id
的列,它在 contracts
table 条记录上是相等的。
我正在尝试加入 contract_descriptions
上的最新记录:
SELECT *
FROM contracts c
LEFT JOIN contract_descriptions d ON d.contract_id = c.contract_id
AND d.date_description =
(SELECT MAX(date_description)
FROM contract_descriptions t
WHERE t.contract_id = c.contract_id)
它有效,但它是执行此操作的高效方法吗?有没有办法避免第二个SELECT
?
您也可以使用 DISTINCT ON
:
SELECT * FROM contracts c LEFT JOIN (
SELECT DISTINCT ON (cd.contract_id) cd.* FROM contract_descriptions cd
ORDER BY cd.contract_id, cd.date_description DESC
) d ON d.contract_id = c.contract_id
DISTINCT ON
每个 contract_id
仅选择一行,而排序子句 cd.date_description DESC
确保它始终是最后一个描述。
性能取决于许多值(例如,table 大小)。无论如何,您应该将这两种方法与 EXPLAIN
.
我觉得你的查询没问题。一种典型的按顺序从另一行 table 连接 n 行的方法是横向连接:
SELECT *
FROM contracts c
CROSS JOIN LATERAL
(
SELECT *
FROM contract_descriptions cd
WHERE cd.contract_id = c.contract_id
ORDER BY cd.date_description DESC
FETCH FIRST 1 ROW ONLY
) cdlast;