2016-11-10 21 views
0

私はゴルフ関連のデータを格納するデータベースを持っています。私は、各コースのホールごとにワシ、バーディ、パーなどの数を数え、その数をホールテーブルの対応する属性に挿入しようとしています。Oracle PL/SQLのクエリ結果をテーブル列に結合

私は望む情報を引き出すためにクエリを書くことができますが、私はクエリ結果を取得し、テーブルの穴内の対応するレコードにマージする方法がわかりません。私は、Oracle SQLのMERGEのドキュメントを見てきましたが、何の成功もありませんでした。

--Count all the birdies on holes 1-18 of course 538 
select phs.course_id, phs.hole_num, count(*) from player_hole_score phs 
join hole h on 
    phs.hole_num = h.hole_num and 
    phs.course_id = h.course_id 
    where phs.score = h.hole_par - 1 and phs.course_id = 538 
    group by phs.hole_num, phs.course_id 
    order by phs.course_id, phs.hole_num; 

--Where the data needs to be inserted 
select course_id, hole_num, hole_num_birdie from hole 
where course_id = 538; 

両方のクエリ結果の下:私は最初のクエリ結果から列COUNT(*)を取り、にカウントを使用することができますどのように

  Query 1          Query 2 (Table Hole) 
+-----------+----------+----------+  +-----------+----------+-----------------+ 
| COURSE_ID | HOLE_NUM | COUNT(*) |  | COURSE_ID | HOLE_NUM | HOLE_NUM_BIRDIE | 
+-----------+----------+----------+  +-----------+----------+-----------------+ 
|  538 |  1 |  103 |  |  538 |  1 |     | 
|  538 |  2 |  76 |  |  538 |  2 |     | 
|  538 |  3 |  42 |  |  538 |  3 |     | 
|  538 |  4 |  71 |  |  538 |  4 |     | 
|  538 |  5 |  82 |  |  538 |  5 |     | 
|  538 |  6 |  77 |  |  538 |  6 |     | 
|  538 |  7 |  90 |  |  538 |  7 |     | 
|  538 |  8 |  34 |  |  538 |  8 |     | 
|  538 |  9 |  188 |  |  538 |  9 |     | 
|  538 |  10 |  87 |  |  538 |  10 |     | 
|  538 |  11 |  53 |  |  538 |  11 |     | 
|  538 |  12 |  95 |  |  538 |  12 |     | 
|  538 |  13 |  137 |  |  538 |  13 |     | 
|  538 |  14 |  69 |  |  538 |  14 |     | 
|  538 |  15 |  170 |  |  538 |  15 |     | 
|  538 |  16 |  197 |  |  538 |  16 |     | 
|  538 |  17 |  56 |  |  538 |  17 |     | 
|  538 |  18 |  82 |  |  538 |  18 |     | 
+-----------+----------+----------+  +-----------+----------+-----------------+ 

ここ

は、私が今持っているものですテーブルHoleの対応するレコードを更新して、次のような結果が得られるようにします。

+-----------+----------+-----------------+ 
| COURSE_ID | HOLE_NUM | HOLE_NUM_BIRDIE | 
+-----------+----------+-----------------+ 
|  538 |  1 |    103 | 
|  538 |  2 |    76 | 
|  538 |  3 |    42 | 
|  538 |  4 |    71 | 
|  538 |  5 |    82 | 
|  538 |  6 |    77 | 
|  538 |  7 |    90 | 
|  538 |  8 |    34 | 
|  538 |  9 |    188 | 
|  538 |  10 |    87 | 
|  538 |  11 |    53 | 
|  538 |  12 |    95 | 
|  538 |  13 |    137 | 
|  538 |  14 |    69 | 
|  538 |  15 |    170 | 
|  538 |  16 |    197 | 
|  538 |  17 |    56 | 
|  538 |  18 |    82 | 
+-----------+----------+-----------------+ 

編集:Afterビューを使用するように聞こえるコメントを聞くことは、これにアプローチする最善の方法です。 mathguyのコードを使用して既存のテーブルにマージできましたが、そのコードをビューに変換する方法がわかりません。特に、サブクエリにエイリアスを割り当てることができないという事実は私を捨ててしまいます。私が作成したビューは、同様のだろうと思った

merge into hole 
    using 
    (select phs.course_id, phs.hole_num, count(*) as ct from player_hole_score phs 
    join hole h on 
     phs.hole_num = h.hole_num and 
     phs.course_id = h.course_id 
     where phs.score = h.hole_par - 1 
     group by phs.hole_num, phs.course_id) 
    q 
    on (hole.course_id = q.course_id and hole.hole_num = q.hole_num) 
    when matched 
    then update set hole.hole_num_birdie = q.ct 

しかし、私は今の私に0の結果を与えているしている:

が、私はこの作品マージのためのコードを持っています。以下で変更する必要があるのは何ですか?

create view hole_statistic as 
    select 
    hh.course_id, 
    hh.hole_num, 
     (select count(*) as ct from player_hole_score phs 
     join hole h on 
      phs.hole_num = h.hole_num and 
      phs.course_id = h.course_id 
      where phs.score = h.hole_par -1 
      group by h.course_id, h.hole_num)  
    as birdies 
    from hole hh 
    group by hh.course_id, hh.hole_num; 
+0

これは難しいことではありませんが、これをしたいと思っていますか?毎日、記録されるイベントが増えています。常にテーブルを更新しますか?通常の(そして効率的な)ソリューションは、これらのすべての統計情報をオンザフライで表示するためのVIEWを常に最新のものにすることです。パフォーマンスが重要な場合は、そのビューを「マテリアライズ」して、クエリを高速に実行できます。 – mathguy

+0

@mathguyそれは学校のプロジェクトのためのもので、私はすべてのデータをすでに収集しているので、記録されるイベントが増えるのではないと思います。私はアップデートステートメントが欲しいので、他に何もする必要のない量をすべて更新することができます。 –

答えて

1
merge into hole 
    using ( your query here ) q 
    on (hole.course_id = q.course_id and hole.hole_num = q.hole_num) 
when matched 
    then update set hole.hole_num_birdie = q.ct 
where hole.course_id = 538 -- this is optional, you can update all at once 

your query hereあなたの最初のクエリで、MINUS必要とされていないORDER BY句。 MERGEステートメントに別名qがあることに注目してください。

最初のクエリでは、count(*)列にエイリアスを指定する必要があります。count(*) as ct

これを行う前に、元の投稿の下にある私のコメントで私が言ったことを考えてください。

+0

マージを使用していただきありがとうございます、それは私がそれを必要とした方法だけでも機能しました。私はビューを使って同じことをするために私のポストを編集しました。あなたは私が上記の試みで修正する必要があることを知っていますか? –

+0

@EricPratt - 私はあなたの質問を理解しているか分からない。ビューの作成は非常にシンプルでなければなりません。 'CREATE VIEW AS SELECT .......'(残りのクエリ)。おそらくWHERE句は必要ありません。ビューを作成するときにはクエリから除外してください。その後、このビューを照会する必要があるときは、「select ... from WHERE ....」と言うことができ、course_idとhole_idをビューに対してこの照会に追加します。 – mathguy

0

パフォーマンスに問題がなければ、テーブルに挿入する代わりにビューを使用します。

関連する問題