DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SQL文の実行

  • 題名: SQL文の実行
  • 著者: こう
  • 日時: 2004/09/06 16:31:51
  • ID: 6017
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[Win 2000 Pro]
分類:[.NET]

こんにちは いつもお世話になっております。
今回はADO.NETでORACLEに接続してみる際にデータアダプタの構成
の部分で以下のSQL文流すとエラーになってしまいます。
SQL*PLUSでも実行してみたところエラーとなったのでSQLの文法
エラーのようですが、どうもどこがエラーなのかわかりません。

SELECT *
FROM (SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT FROM FITNESS ORDER BY JOG_POINT DESC)
WHERE ROWNUM <= 10;

ORA-00907: 右カッコがありません・
のようなエラーが出ます。

何卒よろしくお願い致します。
2004/09/06(Mon) 16:55:06 編集(投稿者)

■No6017に返信(こうさんの記事)
> こんにちは いつもお世話になっております。
> 今回はADO.NETでORACLEに接続してみる際にデータアダプタの構成
> の部分で以下のSQL文流すとエラーになってしまいます。
> SQL*PLUSでも実行してみたところエラーとなったのでSQLの文法
> エラーのようですが、どうもどこがエラーなのかわかりません。
>
> SELECT *
> FROM (SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT FROM FITNESS ORDER BY JOG_POINT DESC)
> WHERE ROWNUM <= 10;
>
> ORA-00907: 右カッコがありません・
> のようなエラーが出ます。
>
> 何卒よろしくお願い致します。

From句はテーブル名です。これでは、SQL文として成り立ちません。
正しくは、
SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT
FROM FITNESS
WHERE ROWNUM <= 10
ORDER BY JOG_POINT DESC;
です。
もしかして、From句にテーブル名をSelectしたいのかな?
そんな事できたっけ?
複数のテーブルを結合してSELECTしたいのであれば、テーブル名をカンマで区切ってください。
複雑な取得をしたいので有れば、「外部結合」,「サブクエリー」,「UNION」などを調べてみてはいかがでしょうか?

SQLについての参考書をひとつ紹介しておきます。
お勧めは、SQLポケットリファレンス:朝井 淳(著),技術評論社 ですかね…
2004/09/06(Mon) 17:02:12 編集(投稿者)

■No6020に返信(ぺがらぼさんの記事)

こんにちは、ぺがらぼさん。

> From句はテーブル名です。これでは、SQL文として成り立ちません。
> もしかして、From句にテーブル名をSelectしたいのかな?
> そんな事できたっけ?

サブクエリからのSELECTは普通にできるみたいですね。(MS-SQLでもOracleでも)
私は「こう」さんに似せて、SQL Plusで以下を試してみましたが、正しくSELECTできました。

SELECT * FROM (SELECT TOKUICD, TOKUINM, TOKUINMR FROM TMA0BA ORDER BY TOKUICD DESC) WHERE ROWNUM <= 10;

# ぺがらぼさんの言うとおり、こうさんの例では、サブクエリからやる必要はないですけど。

■No6017に返信(こうさんの記事)

こんにちは、こうさん。

> SELECT *
> FROM (SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT FROM FITNESS ORDER BY JOG_POINT DESC)
> WHERE ROWNUM <= 10;

見たところ、SQL文の構文には問題なさそうですが、
フィールド名が合っているかどうか再度確認してみてください。
また、ぺがらぼさんの言うように、サブクエリを使わずにやってみてください。
ぺガラボさんjava.nullpoさんどうもありがとうございます。
かっこの中のSELECT文はうまくいくのですが、なぜか全体では
エラーが出てしまいます。 もう少し原因をさぐってみます。
ほんとうにいつもありがとうございます。

こう
■No6021に返信(java.lang.Nullpoさんの記事)
> ■No6020に返信(ぺがらぼさんの記事)
>>From句はテーブル名です。これでは、SQL文として成り立ちません。
>>もしかして、From句にテーブル名をSelectしたいのかな?
>>そんな事できたっけ?
>
> サブクエリーからSELECTは普通にできるみたいですね。
> 私は「こう」さんに似せて以下でやりましたが(SQL Plusで)
> 正しくSELECTできました。
>
> SELECT * FROM (SELECT TOKUICD, TOKUINM, TOKUINMR FROM TMA0BA ORDER BY TOKUICD DESC) WHERE ROWNUM <= 10;
>
>
> ■No6017に返信(こうさんの記事)
>>SELECT *
>>FROM (SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT FROM FITNESS ORDER BY JOG_POINT DESC)
>>WHERE ROWNUM <= 10;
>
> 見たところ、SQL文の構文には問題なさそうですが、
> フィールド名が合っているかどうか再度確認してみてください。

へぇ・・・From句にテーブル以外でSelectできるんだぁ…知らなかった。
勉強になりました。
あ、そういえば、UnionってFrom句で使えるんだった…正直スマンかった。
いえ、ごめんなさい。
java.lang.Nullpoさん、ありがと(^^ゞ


はぁ、スランプだね…落ち込みました。修行してまいります。
(TechED2004の準備に集中しろ!って事だね…)
誰か、Try Catchしてください。
こんばんは 調べて何点かわかりました。
まずOracle8.0.5ではこの書き方はサポートしていないらしいです。
副問い合わせの中にGROUP BY は使用できないとのことです。
この書き方が出来ないことはわかったのですが、この他にどういう
SQL文で同じ用になるかわかるかたいれば教えて下さい。
よろしくお願い致します。

こう
  • 題名: Re[6]: SQL文の実行
  • 著者: ささ
  • 日時: 2004/09/06 18:26:11
  • ID: 6030
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
>>へぇ・・・From句にテーブル以外でSelectできるんだぁ…知らなかった。

こうゆう書き方を「インラインビュー」って言います。
って関係ないレスでした。
2004/09/06(Mon) 19:01:26 編集(投稿者)

■No6029に返信(こうさんの記事)
> こんばんは 調べて何点かわかりました。
> まずOracle8.0.5ではこの書き方はサポートしていないらしいです。
> 副問い合わせの中にGROUP BY は使用できないとのことです。
> この書き方が出来ないことはわかったのですが、この他にどういう
> SQL文で同じ用になるかわかるかたいれば教えて下さい。
> よろしくお願い致します。
>
> こう

ぺがらぼさんの方法でいけるはずでは? :)

SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT
FROM FITNESS
WHERE ROWNUM <= 10
ORDER BY JOG_POINT DESC;



■No6030に返信(さささんの記事)
> こうゆう書き方を「インラインビュー」って言います。
> って関係ないレスでした。

正しい名称を存じませんでした。
ずっと、サブクエリとかビューとか言ってました。
勉強になりました。m(_ _)m



■No6026に返信(ぺがらぼさんの記事)
> はぁ、スランプだね…落ち込みました。修行してまいります。
> (TechED2004の準備に集中しろ!って事だね…)
> 誰か、Try Catchしてください。

try {
  throw new java.lang.NullPointerException();
} catch (java.lang.NullPointerException eNullpo) {
  System.out.println("ぬるぽが発生しますた。");
}

これでいいですね。
■No6029に返信(こうさんの記事)
> こんばんは 調べて何点かわかりました。
> まずOracle8.0.5ではこの書き方はサポートしていないらしいです。
> 副問い合わせの中にGROUP BY は使用できないとのことです。
> この書き方が出来ないことはわかったのですが、この他にどういう
> SQL文で同じ用になるかわかるかたいれば教えて下さい。
> よろしくお願い致します。
>
> こう

Oracle8i以降では「ROWNUM」が使えるけど、確か、こうさんのOracleサーバーは8iでは無いですよね?
だとすると、「ROWNUM」が使えないかも知れません。
そのあたり、バージョン的な差があるので、はっきりと言えませんが、
とりあえず、Oracle7以前では「ROWNUM」が使えないと言うことは確認しています。
試しに「ROWNUM」をはずして実行してみてはいかがでしょうか?
  • 題名: Re[7]: SQL文の実行
  • 著者: java.lang.Nullpo
  • 日時: 2004/09/07 11:47:59
  • ID: 6038
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No6037に返信(ぺがらぼさんの記事)

こんにちは、ぺがらぼさん。

> Oracle8i以降では「ROWNUM」が使えるけど、確か、こうさんのOracleサーバーは8iでは無いですよね?
> だとすると、「ROWNUM」が使えないかも知れません。
> そのあたり、バージョン的な差があるので、はっきりと言えませんが、
> とりあえず、Oracle7以前では「ROWNUM」が使えないと言うことは確認しています。
> 試しに「ROWNUM」をはずして実行してみてはいかがでしょうか?

仰る通り、Oracle 8.1.5以上でないと、ROWNUMが使えなかったと思います。
フォロー感謝いたします。
  • 題名: Re[7]: SQL文の実行
  • 著者: KNMS
  • 日時: 2004/09/07 13:29:10
  • ID: 6042
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No6031に返信(java.lang.Nullpoさんの記事)
> 2004/09/06(Mon) 19:01:26 編集(投稿者)
>
>
> ぺがらぼさんの方法でいけるはずでは? :)
>
> SELECT MEMBER_ID, LNAME, FNAME, JOG_POINT
> FROM FITNESS
> WHERE ROWNUM <= 10
> ORDER BY JOG_POINT DESC;

上の文と、元になった最初の文

SELECT
*
FROM
(
SELECT
MEMBER_ID
, LNAME
, FNAME
, JOG_POINT
FROM
FITNESS
ORDER BY
JOG_POINT DESC
)
WHERE
ROWNUM <= 10;

では違う結果になると思いますよ。
最初の文では、ORDER BYでソートした結果に対して先頭の
10行を取得しますが、ぺがらぼさんの方法では、10行取得
した中でORDER BYのソートがかけられます。

DOBON.NET | プログラミング道 | プログラミング掲示板