• ベストアンサー

サブクエリについて教えてください。

すみませんが、教えてください。 下のようなテーブルhogeから、 各dateIDにつき、deliIDが最大の、priceを取得 しようとしています。 SELECT dateID, price FROM hoge ORDER BY deliID DESC を使って、同じdateIDをはじけば、実現できるのですが、 サブクエリを使うと、一発で実現できそうな気がするのですが、サブクエリを使ったことがないので、よくわかりません。 サブクエリで上記の抽出ができるのか? できるならば、そのSQLを教えてください。 テーブル:hoge dateID,deliID,price 1,1,1000 1,2,1500 1,3,1200 2,1,900 2,2,1100 2,3,2000 3,2,1800 3,3,1300 3,4,800 ...

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

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

WHERE句に、スカラー副問い合わせ ---------------------- SELECT hoge.dateID, hoge.deliID, hoge.price FROM hoge WHERE hoge.deliID = ( SELECT Max(foo.deliID) AS MaxdeliID FROM hoge as foo WHERE foo.dateID = hoge.dateID ); ----------------------- 又は、サブクエリとINNER JOIN ----------------------- SELECT hoge.dateID, hoge.deliID, hoge.price FROM hoge INNER JOIN ( SELECT hoge.dateID, Max(hoge.deliID) AS MaxdeliID FROM hoge GROUP BY hoge.dateID ) AS foo ON (hoge.dateID = foo.dateID) AND (hoge.deliID = foo.MaxdeliID); ----------------------- こんな感じで出来ると思います。 下のクエリの方が、パフォーマンスは良いかも(←かなり推測・・・(^^;)

xyz_1990
質問者

お礼

早速のご回答ありがとうございます。 これから、試してみます。

その他の回答 (1)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

師匠(と勝手に思い込んでます。ご容赦を)の後でなんですが こんなのでも? TOP 1 で拾ってます。 SELECT * FROM hoge WHERE (((hoge.deliID) In (SELECT TOP 1 deliID FROM hoge AS Tx WHERE Tx.dateID = hoge.dateID ORDER BY deliID desc)));

関連するQ&A

  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL
  • サブクエリを使わずに実現したのですが。。。

    現在、Mysql 4.0xを利用してDBを構築しています。 しかしながら、サブクエリが使えないため以下のようなクエリが実現できず困っております。 EX: select mg.*,sumlg.* from mg left join (select id,uid from lg where uid = '00001') as sumlg on mg.id = sumlg.id where sumlg.id is null; 上記SQLは特定のユーザーIDの、テーブルBに存在しないテーブルAのIDをユーザー単位で切り分け抽出するSQL文です。 (テーブルBにはIDとUIDでユニークになるレコードが格納されています。) 上記を実現するためのSQLをどなたかアドバイスください。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • サブクエリについて

    サブクエリが上手く行きません、何が間違ってるのでしょうか? select IODate, (select sum(Price) as "収入" from dailyio where IO='収入' group by IODate) , (select sum(Price) as "支出" from dailyio where IO='支出' group by IODate) from dailyio group by IODate; dailyio------------------------------------- フィールド名 型 Code bigint(20) IODate date IO varchar(255) Koumoku varchar(255) Syousai varchar(255) Memo text Price bigint(20) ----------------------------------------------- ご多忙中とは存じますが宜しくご教授お願いします。

    • ベストアンサー
    • MySQL
  • MySQLで最小値

    次の様な連番が入ったseqというフィールドがあります。 => select seq from hoge order by seq desc; seq ----- 427 426 425 424 423 422 421 420 419 418 (10 rows) これにlimit 5とすると次の様にな結果になります。 => select seq from hoge order by seq desc limit 5; seq ----- 427 426 425 424 423 (5 rows) このlimit 5で表示された結果の最小値(423)を取得したいのですが 上手くいきません。(わかりません) min(seq)を試してみたのですが418が返ってきてしまいます。 => select min(seq) from hoge order by seq desc limit 5; min ----- 418 (1 rows) limitで表示された結果の最小値(423)を とる事はできるのでしょうか? どうぞ宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • サブクエリ

    サブクエリで、t2テーブルに列が無いか、t2テーブルの中でuflgの値が1である列がヒットする場合に真を返すなら、 where ... and 0=(select count(*) from t2) or 0<(select count(*) from t2 where uflg=1) のようにサブクエリに2つのselectを書かないと無理ですか?

  • ★年度ごとに情報を一覧表示

    各情報を、年度ごとに表示したいと考えています。 基となる年度の条件指定方法が分かりません。 (????と記述しているところです。) 各サブクエリは、年度ごとに情報がない時もあります。 select ????,1tbl.day ,2tbl.day ,3tbl.day from  (select nen,max(day) from 1tbl  where nen < '2006' and nen > '2001'  group by nen  order by nen desc ) 1tbl,  (select nen,max(day) from 2tbl  where nen < '2006' and nen > '2001'  group by nen  order by nen desc ) 2tbl,  (select nen,max(day) from 3tbl  where nen < '2006' and nen > '2001'  group by nen  order by nen desc ) 3tbl where ???? 各サブクエリの情報 1tbl-------2tbl------3tbl------- nen--day----nen--day----nen--day--- 2005-2005/12/12-2005-2005/12/13--------- ---------2004-2004/11/10-2004-2004/12/30 2002-2002/09/01------------------ 表示 nen--1day-----2day-----3day--- 2006-------------------- 2005-2005/12/12--2005/12/13------- 2004--------2004/11/10--2004/12/30 2003-------------------- 2002-2002/09/01-------------- 2001-------------------- ↑上記のように表示したいと考えています。 この形で取れるSQLの書き方はあるでしょうか。 (2006年や2003年のように、情報が0件のところは取れなくてもいいです。) サブクエリ部分をばらばらでSQL発行すれば済む話なのですが、 一度に取れる方法は無いのか気になりまして。 (年度のみのテーブルはありません。) よろしくお願いします。

  • サブクエリ 述語のTrue/False

    こんにちは。 サブクエリの勉強をしています。下のURLのサイトを見ていますがわからないことがあります。 http://www.techscore.com/tech/sql/SQL7/07_02.html/#sql76 EXISTS, ANY, ALL はサブクエリが返す値に対して、「TRUE」または「FALSE」の評価を行い、メインクエリの WHERE 句で使用されます。っとあります。 /* EXISTS */ SELECT * FROM 商品表 WHERE EXISTS (SELECT * FROM 商品表 WHERE 商品名 = 'BEER'); 上記のSQLが走り、サブクエリの商品表の中にある、商品名がBEERのモノを抽出しなさいというのは理解できます。理解できないのは、「TRUE」、「FALSE」です。これは1行でも結果が帰ってきたら、それはTRUEとみなされて、EXISITSはサブクエリをTRUEと評価するということでしょうか? つまり、どんな述語でもサブクエリで評価された結果が1行でもあれば、それはTRUEという意味になるのでしょうか?いまいち何がTRUEでFALSEなのかがわかりません・・・宜しくお願いします。

  • 複雑なSELECT

    SELECT * FROM hoge WHERE hoge LIKE '%$okweb%' ORDER BY day DESC; と、ほしい情報が入っているレコードを取得した場合、セレクトした一番最後のレコードの次を取得するにはどうしたらいいのでしょうか?又は一番初めの一つ前のレコードを取得するにはどうしたらいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Access select句でのサブクエリ

    Access2010でのサブクエリについてお教えください。 注文テーブル 商品コード,数量,フラグ A,3,x B,2,x C,1,x A,3,y B,4,y C,3,y このようなテーブルがあります。 SELECT 商品コード,数量 FROM 注文テーブル GROUP BY 商品コード A,6 B,6 C,4 やりたい事はフラグがxの数量も表示たいと思っています。結果としては、下記の結果が欲しいです。 A,6,3 B,6,2 C,4,1 select句でサブクエリを作りました。 SELECT 商品コード,数量,(SELCT 数量 FROM 注文テーブル WHERE フラグ='x' GROUP BY 商品コード) FROM 注文テーブル GROUP BY 商品コード しかしこのコードを実行すると、「このサブクエリでは1つのレコードしか返せません」と表示されます。 どこを修正したら正しいデータを取得することができるでしょうか?

  • SQL-Serverに対してサブクエリが使えない場合がある。

    現在VB5.0(Win98)でSQL Server7(WinNT)を使用しています。 下記のようなサブクエリを使用してSQLを実行しようとしています。 データコントロールのSQLプロパティに直接記述して実行すると、 うまく結果が得られるのですが、 モジュール内でDAOを使用してODBCデータソースに接続し、下記のSQLを実行すると 「入力テーブルまたは、サブクエリが見つかりません。」のようなエラーとなってしまいます。 データコントロールではサブクエリを使用してSQL Serverから結果を取得できるのに モジュール内でSQLを記述してサブクエリを含むSQLを実行するとエラーになってしまうのは 何故でしょうか? サブクエリをどこかで定義する必要などがあるのでしょうか? select new.K_SEID,new.K_HOKENKB,SUM(new.KINGAKU) from (select K_SEID,K_HOKENKB,K_SURYO * B_KAKAKU as KINGAKU from KONYU,BOOK where K_TAISYO = 1 and K_MSGID = B_MSGID and K_LINE = B_LINE) as new group by new.K_SEID,new.K_HOKENKB