0

我想要完成的是 通过内部 SQL 中的所有表获取sendercompid,的所有唯一组合的聚合数据。targetcompidmsgtype

我希望在结果输出中有 2000 万到 4000 万个独特的行。

我无法在 Postgresql 8.3.13 上成功运行下一个查询:

SELECT 
    sendercompid, targetcompid, count(msgtype), msgtype 
FROM 
    (SELECT table_name 
     FROM information_schema.tables 
     WHERE table_catalog = 'test' 
       AND table_schema = 'msg' 
       AND (table_name like 'fix_aee_20121214%') OR 
           (table_name like 'fix_aee2_20121214%')
   ) 
WHERE 
    (sendercompid LIKE '%201%') OR 
    (targetcompid LIKE '%201%') 
GROUP BY 
    sendercompid, targetcompid, msgtype ;

如果此选择在 2 上拆分:外部和内部,则 :inner 将提供表格列表,而外部将在每个表格中进行选择和分组。

如果我将这两个 SQL 作为一个运行,我有一个来自 pgsql db 的别名错误

错误:FROM 中的子查询必须有别名

我试过使用别名,但这个错误并没有消失。

有什么想法我在那里想念的吗?

谢谢你。

4

4 回答 4

1

FROM 不像你想象的那样工作。子选择与任何其他查询一样工作:它产生一组行。外部 SELECT 与这些行一起工作,就好像它们是一个表一样。除此之外没有什么特别的魔法。它不知道您返回的值是表名,并且不会这样对待它们。

您可能可以使用目录表来完成您想要的事情,但这会很复杂而且很麻烦。

由于您的子表似乎是基于日期的分区,我认为您真正想要使用的是 Postgres 中内置的分区支持,如这些文档中所述。本质上,您的分区继承自父表,并且您为每个子表设置范围约束。当您从启用了约束排除的父表中查询时,Postgres 会自动选择适当的分区。

于 2012-12-17T14:28:14.810 回答
1

您可以使用动态 SQL “运行”此类查询。这个想法 - 在 PL\pgSQL 过程中形成正确的查询,表名作为字符串EXECUTE。就像是:

CREATE OR REPLACE FUNCTION public.function1 (
)
RETURNS TABLE (
  "field1" NUMERIC,
  "field2" NUMERIC,
  ...
) AS
$body$
BEGIN
 RETURN EXECUTE 'SELECT * FROM '|| (SELECT table_name from information_schema.tables 
              where table_catalog = 'test' AND 
                    table_schema='msg' AND
                    (table_name like 'fix_aee_20121214%') OR 
                    (table_name like 'fix_aee2_20121214%')); 
END;
$body$
LANGUAGE 'plpgsql';

然后使用类似的东西:

SELECT sendercompid, targetcompid, count(msgtype), msgtype 
       FROM  function1
       WHERE (sendercompid LIKE '%201%') OR 
             (targetcompid LIKE '%201%') 
       GROUP BY sendercompid, targetcompid, msgtype ;

或者您可以创建具有完整查询和一些参数的函数来构建WHERE子句。

详细信息:执行

于 2012-12-17T16:04:09.727 回答
0

如果这只是一个概念,那么:

  1. ERROR: subquery in FROM must have an alias.
  2. 没有列sendercompid, targetcompid, count(msgtype), msgtype来自哪里的信息。

    SELECT sendercompid, targetcompid, count(msgtype), msgtype from (SELECT table_name from information_schema.tables where table_catalog = 'test' AND table_schema='msg' AND (table_name like 'fix_aee_20121214%') OR (table_name like 'fix_aee2_20121214%')一个 WHERE (sendercompid LIKE '%201%') OR (targetcompid LIKE '%201%') GROUP BY sendercompid, targetcompid, msgtype ;

于 2012-12-17T15:34:14.560 回答
-1

为子查询使用别名。最好为所有表设置别名以避免混淆。

于 2012-12-17T14:26:30.353 回答