たびたびお世話になります。Oracle初心者で、PL/SQLを使ってすでに存在するレコードに順位の値を入れようと思っております。
DECLARE
CURSOR カーソル IS SELECT * FROM tb ORDER BY 成績;
n number:=0;
BEGIN
FOR r IN カーソル LOOP
UPDATE tb SET 順位=n
WHERE 成績=r.成績;
n:=n+1;
END LOOP;
END;
FORというもの自体がわからず恐縮です。これは正しく、カーソルで定義したORDER BYの順に動くと考えてもよいのでしょうか。上記を実際にやってみると、うまく順位が入るようなのですが、これはたまたまなのでしょうか。
お恥ずかしい限りですが、どうかよろしくお願いいたします。
DBはoracle10gです。
テーブル(A_TBL)は以下の4つのカラムで構成されています。
seq_no(連番),key_1(個人番号),key_2(更新日),status(状態)
key_1が同一のレコードは、
最新のレコード(最新とは更新日の大きいレコード)以外のstatusを'0'から'4'にします。
例として実行前と実行後のテーブルは以下のような状態です。
【実行前】
seq_no,key_1,key_2,status
1,001,20080101,1
2,001,20080102,0
3,002,20080101,0
4,003,20080101,0
5,003,20080102,0
6,003,20080103,0
7,004,20080101,0
8,004,20080102,2
【実行後】
seq_no,key_1,key_2,status
1,001,20080101,1
2,001,20080102,0
3,002,20080101,0
4,003,20080101,4
5,003,20080102,4
6,003,20080103,0
7,004,20080101,4
8,004,20080102,2
以下のようなSQLを作成し、更新しようとしました。
update A_TBL
set status = '4'
where status = '0'
and seq_no not in (
select wk2.seq_no
from A_TBL wk2,
(select max(key_2) as key_2,
key_1 as key_1
from A_TBL
group by key_1) wk1
where wk2.key_1 = wk1.key_1
and wk2.key_2 = wk1.key_2
and wk2.status = '0'
)
このSQLはin句を使っていますが、
in句を使わずに同様の更新を実現することは出来るでしょうか?
DBはoracle10gです。
テーブル(A_TBL)は以下の4つのカラムで構成されています。
seq_no(連番),key_1(個人番号),key_2(更新日),status(状態)
key_1が同一のレコードは、
最新のレコード(最新とは更新日の大きいレコード)以外のstatusを'0'から'4'にします。
例として実行前と実行後のテーブルは以下のような状態です。
【実行前】
seq_no,key_1,key_2,status
1,001,20080101,1
2,001,20080102,0
3,002,20080101,0
4,003,20080101,0
5,003,20080102,0
6,003,20080103,0
7,004,20080101,0
8,004,20080102,2
【実行後】
seq_no,key_1,key_2,status
1,001,20080101,1
2,001,20080102,0
3,002,20080101,0
4,003,20080101,4
5,003,20080102,4
6,003,20080103,0
7,004,20080101,4
8,004,20080102,2
以下のようなSQLを作成し、更新しようとしました。
update A_TBL
set status = '4'
where status = '0'
and seq_no not in (
select wk2.seq_no
from A_TBL wk2,
(select max(key_2) as key_2,
key_1 as key_1
from A_TBL
group by key_1) wk1
where wk2.key_1 = wk1.key_1
and wk2.key_2 = wk1.key_2
and wk2.status = '0'
)
このSQLはin句を使っていますが、
in句を使わずに同様の更新を実現することは出来るでしょうか?
DBはoracle10gです。
テーブル(A_TBL)は以下の4つのカラムで構成されています。
seq_no(連番),key_1(個人番号),key_2(更新日),status(状態)
key_1が同一のレコードは、
最新のレコード(最新とは更新日の大きいレコード)以外のstatusを'0'から'4'にします。
例として実行前と実行後のテーブルは以下のような状態です。
【実行前】
seq_no,key_1,key_2,status
1,001,20080101,1
2,001,20080102,0
3,002,20080101,0
4,003,20080101,0
5,003,20080102,0
6,003,20080103,0
7,004,20080101,0
8,004,20080102,2
【実行後】
seq_no,key_1,key_2,status
1,001,20080101,1
2,001,20080102,0
3,002,20080101,0
4,003,20080101,4
5,003,20080102,4
6,003,20080103,0
7,004,20080101,4
8,004,20080102,2
以下のようなSQLを作成し、更新しようとしました。
update A_TBL
set status = '4'
where status = '0'
and seq_no not in (
select wk2.seq_no
from A_TBL wk2,
(select max(key_2) as key_2,
key_1 as key_1
from A_TBL
group by key_1) wk1
where wk2.key_1 = wk1.key_1
and wk2.key_2 = wk1.key_2
and wk2.status = '0'
)
このSQLはin句を使っていますが、
in句を使わずに同様の更新を実現することは出来るでしょうか?
SQL初心者のため、初歩的な質問だと思いますが、回答お願いします。
●健康診断テーブル
ID 回数 結果
―――――――
A 1 11
B 1 22
B 2 23
C 1 11
C 2 22
C 3 12
D 1 12
E 1 31
●個人情報テーブル
ID 所属
―――――
A 経理
B 総務
C 営業
D 営業
E 経理
上のような二つのテーブルがあります。
IDは人物の識別に使うIDで、同じIDなら同じ人を表しています。
健康診断テーブルの結果は、回数を重ねると変わってしまうこともあります。
この二つのテーブルから、所属ごとの結果を表示したいです。
上記の場合、以下のようなデータを出力できるようにしたいです。
所属 結果 人数
―――――――――
経理 11 1
経理 31 1
総務 23 1
営業 12 2
どのようにプログラムを組めばいいのでしょうか。
グーグル等で検索しても、自分の理解できる解答は見つかりませんでした。
(自分のプログラムレベルがかなり酷く、わからないがわからないのレベルです)
今は初回・2回・3回と回数を変更するSQL文は作成できています。
すいませんが、回答お願いします。
こんばんは。
複数テーブルの複数カラムをupdateしたいのですが、
うまくいかず困っています。
どなたか助けてください>_<
テーブルA(tableA)のoptionAというカラムと、
テーブルB(tableB)のoptionBというカラムを両方更新したいんです。
やりたい内容のイメージとしてはこんな感じです↓
update tableA a, tableB b
set a.optionA='OK', b.optionB='OK'
where a.student_id=b.student_id and a.name='山田';
どなたかご指導お願いいたします。
Oracle 11gをインストールしたばかりです。
EMの画面からリスナーを選択し、停止ボタンを押そうとしました。
(あくまでも勉強のためです)
ユーザー名およびパスワードが正しくありません。
とでてきてしまいました。
sqlplusにログインできるユーザ名/パスワードですが、うまくいきません。
SELECT username FROM v$session WHERE username IS NOT NULL;
と打ってみましたが、そこででたユーザー名でも駄目でした。
どうか、ここで使われているユーザ名を確かめる方法を教えてください。
Windows XP SP3