假设我有以下表格:
table_1 table_2
id_a name id_a id_b
1 c 1 1
2 a 1 2
3 b 2 1
2 2
现在考虑以下 LEFT OUTER JOIN:
SELECT *
FROM table_1
LEFT OUTER JOIN table_2 USING (id_a)
id_a name id_b
1 c 1
1 c 2
2 a 1
2 a 2
3 b
现在假设“FROM table_1”实际上是一个复杂的子查询,例如:
SELECT * FROM huge_table WHERE expensive_conditions_producing_three_rows
是否可以编写一个仅连接具有最小名称的左侧行的查询,而无需完全重新运行子查询?您可以假设您对子查询有一定的控制权,即如果需要,您可以添加一个 ORDER BY。
换句话说,最终结果应该是这样的:
id_a name id_b
1 c
2 a 1
2 a 2
3 b
我考虑过使用 SELECT INTO 将子查询结果放在一个临时表中。那么计算在 JOIN ON 条件下使用的最小值就不是问题了。但我宁愿避免这种情况,除非它是唯一的解决方案。
编辑:我会等几天,然后接受最好的解决方案,无论 PG 版本如何。不过,如果能在 PG 8.3 及更早版本中运行,我们将不胜感激。
最佳答案
使用 Window functions (可从 PostgreSQL 8.4 获得):
SELECT *
FROM
( SELECT *
, ROW_NUMBER() OVER (ORDER BY SomeColumn) AS RowNum
FROM table_1
) AS a
LEFT JOIN
table_2 AS b
ON
(join condition)
AND
a.RowNum = 1
关于sql - 能否在 Postgres 中有效地 LEFT OUTER JOIN 左表行的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9120738/