sql - 通过自左连接传递聚合函数列

标签 sql mysql postgresql join left-join

我想在列上调用一次聚合函数(成本),并通过自左连接(用于创建行的排列或组合)将其级联。这样我认为成本是 O(n) 并在连接 O(row^joins) 之后调用它。从这样的事情开始:

id | cost 
----------
1  |  5   
2  |  10  

我想做类似下面的事情。我可以通过选择一个临时表并加入它来做类似的事情,但是我想避免使用临时表...

CREATE TEMP TABLE tmp_750309_plans AS (SELECT *, cost(id) as cost  FROM plans WHERE plans.id IN (1,2,...));

SELECT * FROM tmp_750309_plans AS t1 LEFT JOIN tmp_750309_plans AS t2 ON ...

我更愿意做这样的事情:

SELECT id, cost(id) as cost FROM plans AS t1
LEFT JOIN t1 AS t2 
ON t1.id != t2.id
AND ...

要得到这样的东西:

id | cost | id | cost |
-----------------------
1  |  5   |NULL| NULL |
2  |  10  |3   | 15   |

如有任何帮助,我们将不胜感激。

最佳答案

无需创建临时表,只需将您的 SELECT 设为派生表即可:

SELECT * 
FROM (
  SELECT *, cost(id) as cost  
  FROM plans 
  WHERE plans.id IN (1,2,...)
) tmp AS t1 LEFT JOIN tmp AS t2 ON ...

或具有通用表表达式的替代解决方案(适用于 PostgreSQL 8.4 及更高版本)

with tmp as (
  SELECT *, cost(id) as cost  
  FROM plans 
  WHERE plans.id IN (1,2,...)
)
SELECT *
FROM tmp as T1
  LEFT JOIN tmp AS t2 ON ...

关于sql - 通过自左连接传递聚合函数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4273909/

相关文章:

mysql - 使用 Entity Framework 将 MySQL 和 MSSQL 用于两个不同的数据库

postgresql - 如何使用 PostgreSQL 在 Ecto 中使用点列类型

postgresql - postgresql 中的 pg_proc 中不存在该函数

postgresql - 相当于 PgAdmin3 中的 "describe table"

sql - 确定此 Delete 语句的作用

MySql order by (varchar) date in Mmm-dd-yyyy

mysql - SQL 如何按 "Ranges"排序

MySQL 建表脚本 TEXT data_type 语法

mysql - 如果我杀死一个巨大的 MySQL InnoDb DELETE 查询会发生什么?

java - 从 mysql select 获取计数结果并解析到 TextView