Excelを使用して、多数の同一のスキーマを持つデータベースからのスキーマ名のリストから多数のSELECT
ステートメントを生成しました:
select result from foo.table limit 1;
select result from bar.table limit 1;
select result from doo.table limit 1;
(foo
、bar
&doo
は私のスキーマの例であり、実際には何百もあります)。
各SELECT
は1つの結果のみを返します。スキーマと同じ数の行を持つ1つの列result
が必要です。これをスキーマ名に対してExcelにコピーして戻すことができます。
上記のクエリを実行すると、1行が取得され、その他は破棄されます。
1行が破棄されたクエリ結果。 1行が破棄されたクエリ結果。 クエリの合計実行時間:40 ms。 1行を取得しました。
UNION ALL
を使用してみましたが、limit 1
を使用して、各スキーマテーブルから1行のみが返されることを確認し、これが機能しないようにしています。
他の行が破棄されるのを防ぐ方法、または必要な値(2つの列-schema_name、result-各スキーマに1つの行)をより効率的な方法で返すクエリを作成するにはどうすればよいですか?
個々のステートメントを括弧で囲み、構文を明確にします。
(SELECT result FROM tbl1 LIMIT 1)
UNION ALL
(SELECT result FROM tbl2 LIMIT 1)
UNION
に関するマニュアル は、問題に関して非常に明確です。
select_statement
は、ORDER BY
、SELECT
、FOR UPDATE
、またはFOR SHARE
句のないLIMIT
ステートメントです。 (ORDER BY
およびLIMIT
は、括弧で囲まれている場合に部分式に添付できます。括弧がない場合、これらの句はUNION
の結果に適用され、その右側の入力式。)
サブクエリをラップすると回避できますが、少し見苦しくなります。
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の応答を参照してください。より良い方法です
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