• 締切済み

最新の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

みんなの回答

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

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; でも

回答No.2

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.名前 ;

yamaj_biz
質問者

お礼

ご回答ありがとうございます。(遅くなって申し訳ありません。) これだとほぼ目的の動作ができました。 が、個人の情報が多くなると、全部GROUP BY に追加していかないと駄目なんですよねぇ…? ただ、MAX()KEEP()というものを初めて知ったので、これを使って「身長最新」とか「体重最新」のVIEWを作って、個人と外部結合でくっつければ目的は果たせそうですね。 …もっと簡単な方法もあるかもしれませんが。

回答No.1

分析関数の使えるバージョン・エディションであれば・・ 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を調べると幸せになれると思いますよ。

yamaj_biz
質問者

お礼

ご回答ありがとうございます。(遅くなって申し訳ありません。) 教えて頂いたものを使用してみたのですが、これだと身長、体重が入ってない人は出てこないようです。 個人のデータは全部出す(外部結合?)事はできるんでしょうか。