私はゴルフ関連のデータを格納するデータベースを持っています。私は、各コースのホールごとにワシ、バーディ、パーなどの数を数え、その数をホールテーブルの対応する属性に挿入しようとしています。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;
これは難しいことではありませんが、これをしたいと思っていますか?毎日、記録されるイベントが増えています。常にテーブルを更新しますか?通常の(そして効率的な)ソリューションは、これらのすべての統計情報をオンザフライで表示するためのVIEWを常に最新のものにすることです。パフォーマンスが重要な場合は、そのビューを「マテリアライズ」して、クエリを高速に実行できます。 – mathguy
@mathguyそれは学校のプロジェクトのためのもので、私はすべてのデータをすでに収集しているので、記録されるイベントが増えるのではないと思います。私はアップデートステートメントが欲しいので、他に何もする必要のない量をすべて更新することができます。 –