SQL質疑応答スレ 5問目

このエントリーをはてなブックマークに追加
35NAME IS NULL
Oracle9iでのSELECTについて教えてください。

現在のテーブル内情報:

GROUP_ID│REG_DATE │TEL_NO    │STATUS
-────┼─────┼──────┼─────
A001    │2007/10/01│03-9999-0001│ENABLED
A001    │2007/09/20│03-9999-0002│DISABLED
A001    │2007/10/03│03-9999-0002│ENABLED
A001    │2007/10/03│03-9999-0003│ENABLED
A001    │2007/08/01│03-9999-0003│DISABLED
A001    │2007/10/31│03-9999-0004│DISABLED
A001    │2007/10/31│03-9999-0005│DISABLED

このうちTEL_NOが重複しないように、

GROUP_ID│REG_DATE │TEL_NO    │STATUS
-────┼─────┼──────┼─────
A001    │2007/10/01│03-9999-0001│ENABLED
A001    │2007/10/03│03-9999-0002│ENABLED
A001    │2007/10/03│03-9999-0003│ENABLED
A001    │2007/10/31│03-9999-0004│DISABLED
A001    │2007/10/31│03-9999-0005│DISABLED

こうなるように、

・STATUS=ENABLEDで重複無しの場合はそのまま抽出。
・STATUS=DISABLEDで重複無しの場合はそのまま抽出。
・STATUS=DISABLEDとENABLEDの双方が設定されて重複
 登録されているデータについては、
 STATUS=ENABLEDのもののみを重複無しで取得したい。

という条件でselectしたいのですが、
どのように記述すれば良いでしょうか?
よろしくお願いします。
36NAME IS NULL:2007/11/05(月) 19:32:18 ID:???
>>35
ENABLED同士、DISABLED同士で重複している場合は
どういう条件で重複を排除するのか?

なんとなく
select A.GROUP_ID, A.REG_DATE, A.TEL_NO, A.STATUS
from TableName A
   inner join
   (select TEL_NO, max(REG_DATE) as MAX_REG_DATE
    from TableName
    group by TEL_NO
   ) B
   on A.TEL_NO = B.TEL_NO
   and A.REG_DATE = B.MAX_REG_DATE
;
でいいような気がするが。