sql - 能否在 Postgres 中有效地 LEFT OUTER JOIN 左表行的子集?

标签 sql performance postgresql join

假设我有以下表格:

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/

相关文章:

postgresql - 以适用于 JavaSE 的 JavaEE 友好方式获取计时器(用于 JDBC 驱动程序)

sql - 在 SQLite 中选择前 10 个计数

mysql - 如何在sql中将Varchar转换为Double?

r - 等效于 Rcpp 的 lineprof

node.js - 在与数据库的连接上同步 elasticsearch - nodeJS

java - Spring JPA Crud 存储库保存不返回 UUID 字段

SQL子字符串非贪婪正则表达式

c# - 如何更改此 Ext.Net 示例以使用 Sql 而不是 Linq?

javascript - (jQuery) 选择 document.body 而不是父元素

c# - 我应该在 C# 中制作这些向量类还是结构