- ベストアンサー
SQLについて
SQLについてですが、例えば下記のような表があり、 表. no name etc 0001 aaaa 1 0002 bbbb 1 0003 cccc 2 0004 dddd 1 この表から、「etc = '1'」の列を抽出すると、3件が返ってきますが、 その返ってきたデータの一番最後のデータのみを抽出したい場合はどのようにすればよいのでしょうか? (no = 0004 and etc = 1以外の方法でお願いします。。)
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>とやった場合の結果から、エイリアスの「etc_count」を検索条件に使う事って出来ないんですか? 出来ないと思います。(さすがに自宅にOracleを持っているわけではないので、試せないのですが。) グルーピングしてから、HAVINGで(エイリアスではなく式の方を)指定すれば、ひょっとしたら何とかなるかもしれないです。 ですが、この方法だとパフォーマンス的に問題があるかもしれませんね。 nが少ない数でしたら、素直にn行フェッチした方が速い気はしますね。 或いは ADOかoo4oでMOVEするか… っていうか、それ位しか思いつきませぬ(汗 項目に増減のないマスタ項目などで、かつ頻繁に検索するのなら、一旦クライアントにno列を全件取り込んでから… ってのもありかも。
その他の回答 (4)
- yakumon
- ベストアンサー率35% (22/62)
ご参考までに Oracleであればトップnクエリというのができます。 例)etcが'1'でno順にソートし上位10レコードのみ抽出する select rownum, no, name, etc from table where etc = '1' and rownum <= 10 order by no ; ただし以下の命令で10位の情報を得ることはできません。 この命令では行を返しません。 理由は、1行目はrownum=1なので条件に合わずrownumがカウントアップされず、2行目以降もすべて条件にあわないためです。 select rownum, no, name, etc from table where etc = '1' and rownum = 10 order by no ;
お礼
回答ありがとうございました。 やりたかった事が、rownum = 5の条件にヒットするものを取得したいってゆう感じなのでした。。 ですので、別の手段で行おうと思います。 いろいろ考えてもらって、ホントにありがとうございました。
- ARC
- ベストアンサー率46% (643/1383)
#2, tksoftさんの回答が正解かと思いますが、Accessなら、Top句がありますよね。 SELECT TOP 1 * FROM 表 WHERE etc = '1' ORDER BY no DESC; こんな感じです。Access限定ですが(^^;
補足
回答有難うございます。 すみません。。 これも書き忘れていました。。 DBはOracle9iでした。。 一つお伺いしたいのですが、 例えば、 SELECT no, name, etc, ROW_NUMBER() OVER (PARTITION BY etc ORDER BY no) AS etc_count FROM 表名 WHERE etc = '1'; とやった場合の結果から、エイリアスの「etc_count」を検索条件に使う事って出来ないんですか? 再度の回答、宜しくお願い致します。
- tksoft
- ベストアンサー率36% (99/273)
「一番最後のデータ」という意味がちょっと不明ですが、とりあえずnoの一番大きいデータというふうに解釈します。 SELECT no, name, etc FROM TableName WHERE etc = 1 AND no IN (SELECT MAX(no) FROM TableName) と、いうのはどうでしょう。 ポイントはIN句です。
お礼
回答有難うございました。
補足
すばやい回答有難うございます。 私の説明間違いで、少し書き足りない部分が在りました。。 表. no name etc 0001 aaaa 1 0002 bbbb 1 0003 cccc 2 0004 dddd 1 0005 eeee 2 0006 ffff 1 のようなテーブルの時に、no=0004のデータのみを抽出したいのです。 決して最後のデータを取りたいというわけではなく、 ある基準のデータから、etc=1かつX番目のデータを抽出したいという感じです。 私の説明が言葉足らずになってしまったのですが、 こういう場合だとどうなるんですか? 度々で申し訳ありませんが、宜しくお願い致します。
noは連番なんですよね? でしたら、 SELECT MAX(no),name,etc FROM テーブル名 WHERE etc = 1 GROUP BY name ではダメですか?
お礼
回答有難うございました。
補足
すばやい回答有難うございます。 私の説明間違いで、少し書き足りない部分が在りました。。 表. no name etc 0001 aaaa 1 0002 bbbb 1 0003 cccc 2 0004 dddd 1 0005 eeee 2 0006 ffff 1 のようなテーブルの時に、no=0004のデータのみを抽出したいのです。 決して最後のデータを取りたいというわけではなく、 ある基準のデータから、etc=1かつX番目のデータを抽出したいという感じです。 私の説明が言葉足らずになってしまったのですが、 こういう場合だとどうなるんですか? 度々で申し訳ありませんが、宜しくお願い致します。
お礼
エイリアスで検索は、やっぱしダメですか。。 そもそも、一件のSQL文で条件指定で絞り込みまくって結果を取得しようというのが間違いでした。。 よくよく考えてみれば、別の手段でやればって感じですね(^^); いろいろ回答してもらってありがとうございました。