0

私が達成しようとしているのは 、内部SQLのすべてのテーブルを介して、、、のsendercompidすべての一意の組み合わせの集約データを取得することです。targetcompidmsgtype

結果の出力には、20milから40milの一意の行があると思います。

Postgresql8.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:外部と内部で分割されている場合、:内部はテーブルのリストを提供し、外部は各テーブルから選択とグループ化を行います。

これらの2つのSQLを1つとして実行すると、pgsqldbからのエイリアスエラーが発生します

エラー:FROMのサブクエリにはエイリアスが必要です

エイリアスを使用してみましたが、このエラーは消えません。

私がそこに欠けている考えはありますか?

ありがとうございました。

4

4 に答える 4

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句を作成することもできます。

詳細:EXECUTE

于 2012-12-17T16:04:09.727 に答える
1

FROM は思ったようには機能しません。副選択は他のクエリと同じように機能します。つまり、一連の行が生成されます。外側の SELECT は、これらの行をテーブルであるかのように処理します。それ以上の特別な魔法はありません。返される値がテーブル名であるとは認識されておらず、テーブル名として扱われません。

カタログ テーブルを使用して目的を達成できる可能性がありますが、それは複雑でハック的です。

サブテーブルは日付ベースのパーティションのように見えるため、本当に使用したいのは、これらのドキュメントで説明されている Postgres に組み込まれているパーティショニング サポートだと思います。基本的に、パーティションは親テーブルから継承し、各子に範囲制約を設定します。constraint_exclusion を有効にして親テーブルからクエリを実行すると、Postgres は適切なパーティションを自動的に選択します。

于 2012-12-17T14:28:14.810 に答える
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%') ) a 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 に答える