• ベストアンサー

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以外の方法でお願いします。。)

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.4

>とやった場合の結果から、エイリアスの「etc_count」を検索条件に使う事って出来ないんですか? 出来ないと思います。(さすがに自宅にOracleを持っているわけではないので、試せないのですが。) グルーピングしてから、HAVINGで(エイリアスではなく式の方を)指定すれば、ひょっとしたら何とかなるかもしれないです。 ですが、この方法だとパフォーマンス的に問題があるかもしれませんね。 nが少ない数でしたら、素直にn行フェッチした方が速い気はしますね。 或いは ADOかoo4oでMOVEするか… っていうか、それ位しか思いつきませぬ(汗 項目に増減のないマスタ項目などで、かつ頻繁に検索するのなら、一旦クライアントにno列を全件取り込んでから… ってのもありかも。

purton
質問者

お礼

エイリアスで検索は、やっぱしダメですか。。 そもそも、一件のSQL文で条件指定で絞り込みまくって結果を取得しようというのが間違いでした。。 よくよく考えてみれば、別の手段でやればって感じですね(^^); いろいろ回答してもらってありがとうございました。

その他の回答 (4)

  • yakumon
  • ベストアンサー率35% (22/62)
回答No.5

ご参考までに 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 ;

purton
質問者

お礼

回答ありがとうございました。 やりたかった事が、rownum = 5の条件にヒットするものを取得したいってゆう感じなのでした。。 ですので、別の手段で行おうと思います。 いろいろ考えてもらって、ホントにありがとうございました。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

#2, tksoftさんの回答が正解かと思いますが、Accessなら、Top句がありますよね。 SELECT TOP 1 * FROM 表 WHERE etc = '1' ORDER BY no DESC; こんな感じです。Access限定ですが(^^;

purton
質問者

補足

回答有難うございます。 すみません。。 これも書き忘れていました。。 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.2

「一番最後のデータ」という意味がちょっと不明ですが、とりあえずnoの一番大きいデータというふうに解釈します。 SELECT no, name, etc FROM TableName WHERE etc = 1 AND no IN (SELECT MAX(no) FROM TableName) と、いうのはどうでしょう。 ポイントはIN句です。

purton
質問者

お礼

回答有難うございました。

purton
質問者

補足

すばやい回答有難うございます。 私の説明間違いで、少し書き足りない部分が在りました。。 表. 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番目のデータを抽出したいという感じです。 私の説明が言葉足らずになってしまったのですが、 こういう場合だとどうなるんですか? 度々で申し訳ありませんが、宜しくお願い致します。

noname#3345
noname#3345
回答No.1

noは連番なんですよね? でしたら、 SELECT MAX(no),name,etc FROM テーブル名 WHERE etc = 1 GROUP BY name ではダメですか?

purton
質問者

お礼

回答有難うございました。

purton
質問者

補足

すばやい回答有難うございます。 私の説明間違いで、少し書き足りない部分が在りました。。 表. 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番目のデータを抽出したいという感じです。 私の説明が言葉足らずになってしまったのですが、 こういう場合だとどうなるんですか? 度々で申し訳ありませんが、宜しくお願い致します。

関連するQ&A

  • SQLの書き方について教えてください。

    accessについて。 シートの中に列名name、列名friendnameがあります。 name,friendname aaaa,bbbb bbbb,cccc cccc,aaaa dddd,aaaa eeee,bbbb ffff,eeee ほしいデータは aaaa,bbbb,cccc bbbb,cccc,aaaa cccc,aaaa,bbbb dddd,aaaa,bbbb eeee,bbbb,cccc ffff,eeee,bbbb と友達の友達の名前がほしいのです。 SQLの書き方を教えてください。 よろしくお願いします。

  • mysqlについて

    いつもお世話になっております。 またまたmysqlについて質問させていただきます。 下記のようなテーブルがあります。 tabel A | type_id | member_id | date| | 2 | 45| 2012-6-21 | | 2 | 46| 2012-6-22 | | 2 | 47| 2012-6-19 | | 2 | 48| 2012-6-10 | | 4 | 49| 2012-5-23 | | 4 | 50| 2012-5-24 | | 4 | 51| 2012-5-21 | | 4 | 52| 2012-5-22 | | 3 | 53| 2012-7-25 | | 3 | 54| 2012-7-26 | | 3 | 56| 2012-7-23 | | 3 | 57| 2012-7-24 | | 1 | 58| 2012-8-17 | | 1 | 59| 2012-8-18 | | 1 | 60| 2012-8-25 | | 1 | 61| 2012-8-26 | table B | type_id | name | | 1 | aaaa | | 2 | bbbb | | 3 | cccc | | 4 | dddd | 下記の条件で値を取得するSQLをご教授いただけますでしょうか 1.type_idでまとめたものを3件ずつ取得   (三件の中で一番直近のdateを持っているもの順にtype_idを並べる) 2.type_idのまとめた三件がdateの直近順 3.type_idのそれぞれのnameをくっつける 結果として | type_id | member_id | date|name | 4 | 51| 2012-5-21 |dddd | 4 | 49| 2012-5-23 |dddd | 4 | 50| 2012-5-24 |dddd | 2 | 48| 2012-6-10 |bbbb | 2 | 47| 2012-6-19 |bbbb | 2 | 45| 2012-6-21 |bbbb | 3 | 56| 2012-7-23 |cccc | 3 | 57| 2012-7-24 |cccc | 3 | 53| 2012-7-25 |cccc | 1 | 58| 2012-8-17 |aaaa | 1 | 59| 2012-8-18 |aaaa | 1 | 60| 2012-8-25 |aaaa 説明が下手ですみません…分かりにくければ補足説明いたします…

    • ベストアンサー
    • MySQL
  • SQLでの集計

    下記の様に、「複数のitemを買っているuserと購入されたitem」のテーブルと、 user item ---------------------------------- 田中 AAAA 田中 CCCC 田中 EEEE 北野 DDDD 北野 BBBB 北野 AAAA 小堺 CCCC 小堺 EEEE 松本 EEEE 松本 KKKK 松本 CCCC 松本 DDDD 浜田 BBBB 浜田 DDDD 下記の様な IDに紐付いた 「item」のテーブルから、 ID  item ---------------------------------- 1   AAAA 2   BBBB 3   CCCC 4   DDDD 5   EEEE 下記の様に各itemと各itemを買った場合に一緒に買われるitemの一覧を結果 として表示させたいのですが、クエリの作り方が思い浮かばず、困っています。 ※)可能であれば、買われたitemを表示する際にはbuy1から(左側から)同時購入 回数の多いitemを重複せずに並べて表示したい ID  item  buy1  buy3  buy4  buy5  buy6・・・・ ---------------------------------- 1  AAAA CCCC BBBB DDDD EEEE 2  BBBB DDDD AAAA 3  CCCC AAAA EEEE DDDD KKKKK 4  DDDD AAAA BBBB CCCC EEEE 5  EEEE AAAA CCCC KKKKK 尚、IDと紐付いているitem数は決まっていますが、買われるitemの種類は上記 の様にIDが1~5だけではなく、集計してみないと判らない状況です。 今の所、SQLはACCESS(2003)上にて手打ちしています。 以上、ご教示のほど、宜しくお願い致します。

  • [Excel]重複データの一方のセルが持つ値を一方の空白セルに反映させたい

    A列にある7000件ほどのデータの中から重複データのみを抽出し、 重複データの一方がB列に持つ値を、もう一方のデータのB列の空白セルに反映させたいのですが、方法はありますでしょうか? 「COUNTIF」を使って重複データの抽出はできますが、一方が持つデータをもう一方の空白に反映させることができません。 手作業では期限に間に合わない可能性がみえて焦っております。 恐縮ですがご教授いただけますでしょうか。 (例) [処理前] A列:B列:C列 1111:AAAA:aaaa 2222:BBBB:bbbb 3333:CCCC:cccc 1111:    :dddd 2222:    :eeee [処理後] A列:B列 1111:AAAA:aaaa 1111:AAAA:dddd 2222:BBBB:bbbb 2222:BBBB:eeee

  • access で 方法を教えてください。

    access で 方法を教えてください。 テーブルは セミコロン区切りで、区切られて表示されています (テーブル例)  1 aaaa;bbbb;cccc;dddd;eeee;ffff 2000byte 2 aaaa 300byte 3 bbbb;cccc;ffff 3000byte 4 ffff;dddd 120byte このセミコロン区切りの区切られたデータの 「件数」と「バイト」を表で表示させる方法を教えて欲しいのです。 上記テーブル例を使用しての(抽出例)  抽出条件    ↓   aaaa 2件 2500byte   bbbb 2件 5000byte  cccc 2件 5000byte   dddd 2件 2120byte   eeee 1件 2000byte   ffff 3件 5120byte 宜しくお願いします。

  • SQLで1つのレコードから複数行挿入するには

    下記のようなレコードがあります。 node_id_1 node_nm_1 node_id_2 node_nm_2 ------------------------------------- 00001   AAAA    00002   BBBB 00003   CCCC    00004   DDDD このレコードを元に下記のようなデータを別テーブルに挿入したいのですが、SQLで可能でしょうか id node_id node_nm ----------------- 1  00001  AAAA 1  00002  BBBB 2  00003  CCCC 2  00004  DDDD idはシーケンスで取得します。そして、同一レコードだったものには同じidを振ります。 DBはPostgreSQL 8.4です。

  • 表の抽出方法を教えてください

    :::::::::::::::::::::::::::::aaaa::::bbbb::::cccc::::dddd :::0~1000::::::::::::::700:::::800:::::900::::1000 1001~2000:::::::::800:::::900::::1000::::1200 2001~3000::::::1000::::1300::::1600::::1800 上記のような表で1400のbbbbの時に900を抽出する方法を教えてください

  • SQLでの条件抽出方法の記述

    はじめまして。 今回、SQLである条件を絞りたいのですがその方法がいまいちピンと来ず、思考錯誤しております。 例えばですが… テーブルにCD,DATA,YMと定義します。 条件としては、 ・MAXを使わずに、YMという値の個々別の最新のもの ・同じCDは重複しない1件のみ(DISTINCT?) ・表示するのはCDとDATAのみ ・(下図で言うと)DATAは0402~0405まで(BETWEEN?) 図で表すと、 CD DATA YM ---------------- 01 AAAA 0401 01 AAAA 0402 01 AAAA 0403 01 AAaa 0404 01 AAaa 0405  ←01の最新 02 BBBB 0402 02 BBBB 0403  ←02の最新 03 CCCC 0402 03 CCCC 0404 03 cccc 0405  ←03の最新 03 cccc 0406  ←これは期間外    ↓ CD DATA YM ---------------- 01 AAaa 0405 02 BBBB 0403 03 cccc 0405 このように抽出したいのですが、良い書き方はあるでしょうか?

  • Access Union について

    下記2テーブルがあります。 テーブル1 品番   1月合計 AAAA   1111 BBBB   2222 CCCC   1122 EEEE   3211 テーブル2 品番   2月合計 AAAA   1211 BBBB   3222 CCCC   1522 DDDD   2223 UNIONのSQL文で下記のような結果を得たいです。 品番   1月合計  2月合計 AAAA   1111    1211 BBBB   2222    3222 CCCC   1122    1522 DDDD         2223 EEEE   3211 SQL文をどのように書いたらいいですか。ご教授,お願い致します。

  • SQLが組めません…

    大変恥ずかしい話ですが恥をしのんでHelpさせていただきます。 例えばテーブルTESTに項目がCODE,NAMEとあったとして NAMEの内容がかぶっている項目が有ったら 大きいCODEの方を小さいCODEの内容に上書きするSQLを組みたいのです ex) CODE NAME --------- 0001 AAAA 0002 AAAA 0003 BBBB 0004 CCCC 0005 CCCC を以下のような実行結果にしたい ex) CODE NAME --------- 0002 AAAA 0002 AAAA 0003 BBBB 0005 CCCC 0005 CCCC どなたかお応えください お願いします。。。 使用しているのはORACLE9iです。