ちょっと変わったマニアな作品が集結

初めて利用させていただきます。
-miru-と申します。

現在、
RDBMS:IBM DB2 7.2
OS:Windows 2000
なのですが、
タイトルの通り、
SELECT結果がSELECTできず困っています。

やりたい事の概要
YMD_DATAはDATE型です。
1.
SELECT YMD_DATA
FROM TEST.TEST_TABLE
WHERE YMD_DATA < '2004-10-15' AND
FLAG = '1'
ORDER BY YMD_DATA DESC
FETCH FIRST 30 ROWS ONLY
でFLAGが1且つ指定した年月日以前のデータを
新しいものから30件取得
2.
1で取得した結果の一番古い年月日(30個目のデータ)を
 取得

と、いう感じなのですが、どうもうまくいきません。。
1つのSQLで書きたいのですが、これは可能でしょうか?

分かる方がいらっしゃいましたら、
ご教授お願いいたします。
失礼します。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

1.新しいもの順にRANKをつける


2.RANKが30以下(新しいもの30位まで)取得
3.順位が低い順に表示
4.1件のみ取得

"2."で同日のものがあった場合30ぴったしにはならないけど、欲しいデータは
「指定日にち内の30番目に新しいデータ行」
という解釈であればこれでいいんではないでしょうか?
----------------------------------------------
SELECT YMD_DATA, RNK
FROM
(
SELECT
--新しいもの順に順位をつける
YMD_DATA,RANK() OVER (ORDER BY YMD_DATA DESC) AS RNK

FROM
TEST.TEST_TABLE
WHERE
YMD_DATA < '2004-10-15'
AND FLAG = '1'
) as aaa
--新しいもの上位30件を取得
WHERE RNK <= 30

--順位が低い順に表示
ORDER BY RNK DESC
FETCH FIRST 1 ROWS ONLY
    • good
    • 2

こんばんは。



>()の中の文でORDER BYを使うとダメになってしまう感じです。
そんな事はありませんよ。
DB2でも副問い合わせ式内で、ORDER BYは使えます。
って、マニュアルにはありますが・・・?

FROM句でダメなら、WHERE句に指定してみては?
大外で、逆ORDER BYとFETCH FIRST 1 ROWS ONLY
みたいな感じでは・・・?
(^^ゞ
    • good
    • 0

DB2で確認できる環境が無いので想像で答えています。


以下の様に、最小の日付を取れば良いのではないでしょうか?

SELECT MIN(YMD_DATA)
FROM TEST.TEST_TABLE
WHERE YMD_DATA < '2004-10-15' AND
FLAG = '1'
ORDER BY YMD_DATA DESC
FETCH FIRST 30 ROWS ONLY
    • good
    • 0
この回答へのお礼

回答ありがとうございます^^

nukiさんに回答いただいたSQLだと

SELECT 文節、HAVING 文節、または ORDER BY 文節に指定された "YMD_DATA" で始まる式が、GROUP BY 文節に指定されていないか、あるいは GROUP BY 文節の指定されていない列関数のある SELECT 文節、 HAVING 文節、または ORDER BY 文節中に入っています。

と、いうエラーが出てしまいます。。
それでGROUP BY を追加すると、やっぱり1件にしぼられないのです。。

良回答ありがとうございましたM(__)M

お礼日時:2004/10/15 17:01

select YMD_DATA from (


SELECT YMD_DATA
FROM TEST.TEST_TABLE
WHERE YMD_DATA < '2004-10-15' AND
FLAG = '1'
ORDER BY TAIS_YMD_DATA asc
FETCH FIRST 30 ROWS ONLY) tblTemp
order by YMD_DATA desc

でできないかな。
つまり最初に「YMD_DATA」をascで30件取る。で,さらに「YMD_DATA」をdescで1件取る。
なんてどうですか?

RDBMSていうのがどんなのか知らないんだけど。

この回答への補足

迅速な回答ありがとうございますm(__)m

"FLAG = '1'" に続いて予期しないトークン "ORDER" が見つかりました。入力が予想されるトークンには ")" が含まれている可能性があります。

と、エラーメッセージが出てしまいSQLが通りません;_;
すごくいけそうな予感がしたのですが。。

>最初に「YMD_DATA」をascで30件取る。
のところなのですが、YMD_DATAから
WHEREで指定した年月日以前で、新しいものを30件と取得したいので、descでないといけないかと思います。。

補足日時:2004/10/15 12:42
    • good
    • 1

FROM の後ろにSELECT文を書けばよろしいかと



例えば

SELECT * FROM (SELECT * FROM テーブル WHERE 条件1)
WHERE 条件2

こんな感じで

この回答への補足

回答ありがとうございます^^

私も最初そう思いまして、そういう風に記述してみたのですが

"_DATA < '2004-10-15'" に続いて予期しないトークン "ORDER" が見つかりました。入力が予想されるトークンには ")" が含まれている可能性があります。

とエラーメッセージが出てしまいました。

何だか
SELECT * FROM (SELECT * FROM TABLE_NAME)
は()の中の文でORDER BYを使うとダメになってしまう感じです。
ORDER BY を()内で使用しない場合は通るのです。。
でも使用しないと正しい結果が得られないので、困っています。。

補足日時:2004/10/15 12:51
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

Q抽出結果を元にさらに抽出する方法

先程こちらで質問させていただきました。
http://oshiete1.goo.ne.jp/qa5243225.html

ちょっとややこしくなってしまったので簡単な結合(inner join)の使い方等分かるサイトはありませんか。

宜しくお願い致します。

Aベストアンサー

イメージとしては

[ユーザー]
┌──────┬─────┬────────┐
│ユーザー名 |紹介者名 |登録時刻    |
├──────┼─────┼────────┤
│山田    │(null)  |2009/08/01 12:23|
│佐藤    │山田   |2009/08/02 23:56|
│吉田    │佐藤   |2009/08/15 15:31|
│田中    │山田   |2009/08/28 09:15|
└──────┴─────┴────────┘
っていうテーブルがあるときに、
┌──────┬─────┬────────┬───────┬────────┐
│ユーザー名 |紹介者名 |登録時刻    |紹介者の紹介者|紹介者の登録時刻|
├──────┼─────┼────────┼───────┼────────┤
│山田    │(null)  |2009/08/01 12:23|(null)    |(null)     |
│佐藤    │山田   |2009/08/02 23:56|(null)    |2009/08/01 12:23|
│吉田    │佐藤   |2009/08/15 15:31|山田     |2009/08/02 23:56|
│田中    │山田   |2009/08/28 09:15|(null)    |2009/08/01 12:23|
└──────┴─────┴────────┴───────┴────────┘
こんなのがほしいってことですかね?

上記のイメージで正しければ、
質問のURLに掲載された質問の答えは

select
  A.ユーザー名
  ,A.紹介者名
  ,A.登録時刻
  ,B.紹介者名 as '紹介者の紹介者'
  ,B.登録時刻 as '紹介者の登録時刻'
from
  ユーザー      A
  left join ユーザー B
  on     B.ユーザー名 = A.紹介者名

ではないでしょうか。


from
  ユーザー      A
  left join ユーザー B
  on     B.ユーザー名 = A.紹介者名

この部分を、1行で書き直してちょっと加工すると
  (ユーザー A) left join (ユーザー B)
となります。
left join の意味としては、
『左側のテーブルのレコードは全部表示しつつ、
 右側のテーブルは条件(on)にあうレコードがあればくっつける』
といった感じです。


とりあえず、想定しているイメージが異なるかもしれないので
いったんここで回答をきっておきますね^^

イメージとしては

[ユーザー]
┌──────┬─────┬────────┐
│ユーザー名 |紹介者名 |登録時刻    |
├──────┼─────┼────────┤
│山田    │(null)  |2009/08/01 12:23|
│佐藤    │山田   |2009/08/02 23:56|
│吉田    │佐藤   |2009/08/15 15:31|
│田中    │山田   |2009/08/28 09:15|
└──────┴─────┴────────┘
っていうテーブルがあるときに、
┌──────┬─────┬────────┬───────┬────────┐
│ユーザー名 |紹介者名 |登録時刻    |紹介者の紹介者|紹介...続きを読む

QSelect結果をSelect

お世話になります。

以下のSQL文のイメージでselectの結果をさらにselectしたいのですが”subquery has too many columns”というエラーを吐かれます。
Postgreに合った書き方がお分かりでしたら教えてください。
よろしくお願いします。


select *
from [DB名]
where [パスワード] = 'test'
IN ( select * from [DB名] where [ユーザID]='1111' order by [更新日] desc limit 3)


[やりたいこと]
テストDBからユーザIDが1111の行を更新日をキーに降順で並べ、先頭から3行分を取り出す。
その3行からパスワードが"test"のものをselectしたい。

Aベストアンサー

select *
from ( select * from [DB名] where [ユーザID]='1111' order by [更新日] desc limit 3)
where [パスワード] = 'test'

って感じでしょうか。
手元にテスト環境が無いので未検証です。

Q【SQL】他テーブルに含まれる値に合致する行を抽出

SQL素人ですが、SQLが使えるツールからデータを抽出したく、SQL文を教えていただけますでしょうか。

・テーブルA:会員データが格納されている(氏名、メルアド、郵便番号等が入っている)
・テーブルB:特定の郵便番号のみが入っている

テーブルAのデータの中からテーブルBに入っている郵便番号に合致するメルアドを抽出したい。

何卒宜しくお願い申し上げます。

Aベストアンサー

>SQLが使えるツール
によって変わってくる場合がありますが、
SELECT メルアド FROM テーブルA
WHERE 郵便番号 IN (SELECT 郵便番号 FROM テーブルB)
とか。

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QSQL、2つのテーブルで条件一致したものだけdeleteする方法は?

オラクルSQLで質問です

やりたいことは、
テーブルAから以下の条件に該当するデータを削除する。
基本的にはテーブルBの内容と比較して、一致したもの。

条件(全ての条件を満たすこと)
 テーブルA.AAA = テーブルB.AAA
 テーブルA.BBB = テーブルB.BBB
 テーブルB.CCC > 0


調べたところ、SQLサーバでは以下のように
from を2つ書いて実現できるようです。
が、今回はオラクルなので文法エラーになります。

delete FROM テーブルA FROM テーブルB
where
テーブルA.AAA = テーブルB.AAA
AND
テーブルA.BBB = テーブルB.BBB
AND
テーブルA.CCC > 0
;
commit;


よろしくお願いします

Aベストアンサー

delete 文の細かい構文はちょっと覚えてませんが
サブクエリ使えばいいんじゃないですか

delete from table_a
where 主キーカラム = (
select table_a.主キーカラム
from table_a, table_b
where
指定の条件
)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング