- - PR -
すいません。SQL構文の質問です。
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-06 20:44
こんばんは。
すいません。初心者のSQL構文の質問です。 データベースはSQLServer2000です。 ID|DATA|日付 1 |AA |2005/12/01 2 |BB |2005/12/03 1 |CC |2005/12/04 1 |DD |2005/12/06 2 |EE |2005/12/02 のようなテーブルから、 ID毎に日付が一番新しいレコードだけを取り出したいと思っています。 ID|DATA|日付 1 |DD |2005/12/06 2 |BB |2005/12/03 という結果を取得したいのです。 幾つかのテーブルから値をひっぱてきて、 何とか上のテーブルのようにすることまではできたのですが、 そこから先がわからなくて。 「SQLを質問される方へのアドバイス」 のスレッドに書いてあるとおり、本来なら自己解決しなくてはいけないのですが、 どうにも出来ないので、質問させて頂きました。 どうか、よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2005-12-06 20:59
これが参考になりますよ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19846&forum=26 | ||||||||||||
|
投稿日時: 2005-12-06 22:25
ご返答ありがとうございます。
紹介していただいたスレッド、大変勉強になりました。 スレッド内にあるNAOさんの SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード) 構文を参考にさせて頂いているのですが、 ちょうど「テーブル名」の部分が(SELECT 〜 ) AS TABLE になっていまして、 どうもうまくいきません。 これだけ明快な構文があるので、わかる人にはすぐにわかるのでしょうが、 私は、頭の回転がよくないので、応用しきれずにこんがらがっています。 情けないです・・・。 | ||||||||||||
|
投稿日時: 2005-12-07 09:12
うまくいかないというのはどういうことなんでしょうか?
エラーが出るということでしょうか? それとも思ったとおりの抽出ができないということでしょうか? うまくいかない内容を書かないと他の人には伝わりませんよ? | ||||||||||||
|
投稿日時: 2005-12-07 09:35
おはようございます。
他にも書き方はあると思いますが、とりあえず思いついたのはこんなかんじです。 検証してないのでちょっと自信はないですが・・・ サブクエリはいろいろな使い方ができます。工夫して使いましょう。 | ||||||||||||
|
投稿日時: 2005-12-07 09:46
らいと申します。
上記構文を使用しているのであれば、できるはずです。
……? とりあえず、なぜ「AS TABLE」が出てくるかわかりません。 テーブル名ではないでしょうし。 もしかして、既存のSQL式を変換しようとしてます? であれば、それも出してもらえないと ちゃんとした回答をすることができません。 で、とりあえず。 一番初めに出されたもの(DBの中身)を実現するSQL式は、以下のとおり。 # テーブル名はテキトーなので、付け替えてくださいね。 # 一応下では「AAA」という名前で書いてあります。
では。 _________________ 一寸先は闇 安定してるシステムって言ったじゃん(泣) | ||||||||||||
|
投稿日時: 2005-12-07 10:50
おはようございます。
SELECT〜の中身は、 SELECT M_営業先.営業先ID, データNo, M_営業先.業種区分ID, M_営業先.都道府県ID, M_営業先.市区町村ID, 営業データ.関心度ID, 施設名, 施設名, 郵便番号, 住所, TEL, FAX, 担当者, MAIL, ISNULL(PREF.都道府県正式名,'') AS 都道府県, ISNULL(CITY.市区町村名,'') AS 市区町村, ISNULL(KIND.業種名,'') AS 業種名, ISNULL(RES.関心度,'') AS 関心度, メモ, REPLACE(CONVERT(VARCHAR,CAST(ISNULL(販売数量,0) AS MONEY),1),'.00','') AS 販売数量, REPLACE(CONVERT(VARCHAR,CAST(ISNULL(販売金額,0) AS MONEY),1),'.00','') AS 販売金額, ISNULL(CONVERT(VARCHAR,(CONVERT(VARCHAR,DATEPART(yyyy,日付)) + '/' + RIGHT('0' + CONVERT(VARCHAR,DATEPART(mm,日付)), 2) + '/' + RIGHT('0' + CONVERT(VARCHAR,DATEPART(dd,日付)), 2))),'') AS 日付 FROM 営業データ LEFT JOIN M_営業先 ON (営業データ.営業先ID = M_営業先.営業先ID) LEFT JOIN ( SELECT 都道府県正式名, 営業先ID FROM M_営業先 LEFT JOIN M_都道府県 ON (M_営業先.都道府県ID = M_都道府県.都道府県ID) WHERE M_都道府県.削除フラグ = 0 ) AS PREF ON (営業データ.営業先ID = PREF.営業先ID) LEFT JOIN ( SELECT 市区町村名, 営業先ID FROM M_営業先 LEFT JOIN M_市区町村 ON (M_営業先.市区町村ID = M_市区町村.市区町村ID) WHERE M_市区町村.削除フラグ = 0 ) AS CITY ON (営業データ.営業先ID = CITY.営業先ID) LEFT JOIN ( SELECT 業種名, 営業先ID FROM M_営業先 LEFT JOIN M_業種 ON (M_営業先.業種区分ID = M_業種.業種区分ID) WHERE M_業種.削除フラグ = 0 ) AS KIND ON (営業データ.営業先ID = KIND.営業先ID) LEFT JOIN ( SELECT 関心度, 関心度ID FROM M_関心度 WHERE 削除フラグ = 0 ) AS RES ON (営業データ.関心度ID = RES.関心度ID) WHERE 営業データ.削除フラグ = 0 になっています。 それを全体でくくって、 (SELECT * FROM 〜) AS TABLE にしてやってみています。 「TABLE」と書いたために、余計に皆さんにご迷惑をおかけしたのかもしれません。 すいません。 けして、 SELECT * FROM テーブル名 テーブル別名 WHERE 取引日付=(SELECT MAX(取引日付) FROM テーブル名 WHERE 銘柄コード=テーブル別名.銘柄コード) が間違っていると言っているのではないです。 ごめんなさい。 >うまくいかない内容を書かないと他の人には伝わりませんよ? そのとおりですね。 エラーが出てしまいます。 多分カッコの括りとか、そんな単純な間違いだと思うのですが、 小心者ですので、追い込まれてテンパってしまっています。 他のスレッドなどを見ていると凄く高度な質問が多くて、 こんな質問でスレッドを立てたら、迷惑がられるかなと思っていたのですが、 みなさんが凄く親切に返答をして下さるので、大変感謝しております。 今後もよろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2005-12-07 11:25
エラーが出ているのであれば、おそらく記述ミスなんでしょうね。
例を元にするとこんな感じになりそうですね。 SELECT * FROM (SELECT 〜) as TABLE1 WHERE 取引日付=(SELECT MAX(日付) FROM (SELECT 〜) as TABLE2 WHERE TABLE2.ID=TABLE1.ID) |