- 締切済み
最新の1行のみを取得する。
個人テーブル、身長テーブル、体重テーブルという3つのテーブルがあり、それぞれ以下の通りの構造となっています。 CREATE TABLE T個人 ( 番号 NUMBER(4,0) NOT NULL, 名前 VARCHAR(20) NOT NULL, ); CREATE TABLE 身長 ( 番号 NUMBER(4,0) NOT NULL, 更新 NUMBER(4,0) NOT NULL, 身長 NUMBER(4,0) NOT NULL, ); CREATE TABLE 体重 ( 番号 NUMBER(4,0) NOT NULL, 更新 NUMBER(4,0) NOT NULL, 体重 NUMBER(4,0) NOT NULL, ); これら3つのテーブルを用いて以下のようなViewを作りたいのですが… 番号,名前,身長,体重 身長及び体重テーブルに「更新」というフィールドがあり、同じ番号の場合、上書きではなく更新番号を増やしています。 番号,更新,身長 -------------- 0001,0001,0155 0001,0002,0157 0002,0001,0163 0002,0002,0162 最新の情報のみを引っ張るSQL文はどのように記述すれば良いのでしょうか。 番号,名前,身長,体重 ------------------- 0001,NAME,0157,0038 0002,NAME,0162,0044
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nora1962
- ベストアンサー率60% (431/717)
select k.番号 as 番号 ,k.名前 as 名前 ,(select s.身長 from 身長 s where k.番号 = s.番号 and not exists ( select 1 from 身長 s2 where s.番号 = s2.番号 and s.更新<s2.更新)) as 身長 ,(select t.体重 from 体重 t where k.番号 = t.番号 and not exists ( select 1 from 体重 t2 where t.番号 = t2.番号 and t.更新<t2.更新)) as 体重 from T個人 k; でも
- o123459876
- ベストアンサー率59% (19/32)
select k.番号 as 番号 ,k.名前 as 名前 ,max(s.身長)keep(dense_rank Last order by s.更新) as 身長 ,max(t.体重)keep(dense_rank Last order by t.更新) as 体重 from 個人 k ,身長 s ,体重 t where k.番号 = s.番号 and k.番号 = t.番号 group by k.番号,k.名前 ;
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
分析関数の使えるバージョン・エディションであれば・・ select X.番号,X.名前,Y.身長,Z.体重 from T個人 X, (select 番号,身長,row_number() over(partition by 番号 order by 更新 desc) R1 from 身長) Y, (select 番号,体重,row_number() over(partition by 番号 order by 更新 desc) R2 from 体重) Z where X.番号=Y.番号 and X.番号=Z.番号 and R1=1 and R2=1 ; とかで良いかと。 分析関数のROW_NUMBERを調べると幸せになれると思いますよ。
お礼
ご回答ありがとうございます。(遅くなって申し訳ありません。) 教えて頂いたものを使用してみたのですが、これだと身長、体重が入ってない人は出てこないようです。 個人のデータは全部出す(外部結合?)事はできるんでしょうか。
お礼
ご回答ありがとうございます。(遅くなって申し訳ありません。) これだとほぼ目的の動作ができました。 が、個人の情報が多くなると、全部GROUP BY に追加していかないと駄目なんですよねぇ…? ただ、MAX()KEEP()というものを初めて知ったので、これを使って「身長最新」とか「体重最新」のVIEWを作って、個人と外部結合でくっつければ目的は果たせそうですね。 …もっと簡単な方法もあるかもしれませんが。