web-dev-qa-db-ja.com

PostgreSQLは複数のselectステートメントを組み合わせます

Excelを使用して、多数の同一のスキーマを持つデータベースからのスキーマ名のリストから多数のSELECTステートメントを生成しました:

select result from foo.table limit 1;
select result from bar.table limit 1;
select result from doo.table limit 1;

foobardooは私のスキーマの例であり、実際には何百もあります)。

SELECTは1つの結果のみを返します。スキーマと同じ数の行を持つ1つの列resultが必要です。これをスキーマ名に対してExcelにコピーして戻すことができます。

上記のクエリを実行すると、1行が取得され、その他は破棄されます。

 1行が破棄されたクエリ結果。
 
 1行が破棄されたクエリ結果。
 
クエリの合計実行時間:40 ms。
 1行を取得しました。

UNION ALLを使用してみましたが、limit 1を使用して、各スキーマテーブルから1行のみが返されることを確認し、これが機能しないようにしています。

他の行が破棄されるのを防ぐ方法、または必要な値(2つの列-schema_name、result-各スキーマに1つの行)をより効率的な方法で返すクエリを作成するにはどうすればよいですか?

12
Andrew M

個々のステートメントを括弧で囲み、構文を明確にします。

(SELECT result FROM tbl1 LIMIT 1)
UNION ALL
(SELECT result FROM tbl2 LIMIT 1)

UNIONに関するマニュアル は、問題に関して非常に明確です。

select_statementは、ORDER BYSELECTFOR UPDATE、またはFOR SHARE句のないLIMITステートメントです。 (ORDER BYおよびLIMITは、括弧で囲まれている場合に部分式に添付できます。括弧がない場合、これらの句はUNIONの結果に適用され、その右側の入力式。)

20

サブクエリをラップすると回避できますが、少し見苦しくなります。

SELECT result FROM (select 'a'::text AS result from foo limit 1) a
UNION ALL
SELECT result FROM (select 'b'::text AS result from bar limit 1) b

[〜#〜]更新[〜#〜]

Erwinの応答を参照してください。より良い方法です

5
Glenn
create view my_data1 
AS
with data as
(
    select student_id,sum(marks) as total_marks 
    from   marks_marks 
    group by 1
) , 
data1 as
(
    select id, name 
    from   students_class
), 
data2 as
(
    select applicant_name,
           id,
           class_name 
    from   students_students
)
select data2.applicant_name , 
       data1.name as class_name ,  
       data.total_marks 
from   data2 
join   data1  on data1.id = data2.class_name 
join   data   on data.student_id = data2.id



select * from my_data1
1
Sachin Burnawal