16

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

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

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

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

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

1 行が破棄されたクエリ結果。

1 行が破棄されたクエリ結果。

合計クエリ実行時間: 40 ミリ秒。
1 行が取得されました。

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

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

4

3 に答える 3

31

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

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

についてのマニュアルUNIONは、この問題について非常に明確です:

select_statement、、 、または句のない任意のSELECTステートメントです。( andは、括弧で囲まれている場合、部分式に付加できます。括弧がない場合、これらの句は 、右側の入力式ではなく、の結果に適用されると見なされます。)ORDER BYLIMITFOR UPDATEFOR SHAREORDER BYLIMITUNION

于 2012-08-06T17:35:25.360 に答える
8

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

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 の応答を参照してください。それはさらにいいです。

于 2012-08-06T13:07:49.367 に答える
6
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
于 2018-01-17T09:32:54.307 に答える