トップページ⇒tech
1001コメント347KB

SQL教えて〜!! <2>

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ということで、賛否両論でしたがたてますた

前スレ
SQL教えて〜!!
http://pc3.2ch.net/test/read.cgi/tech/1000116969/l50

関連スレは>>2-3
0153デフォルトの名無しさんNGNG
>>152
つうか、実行プランは調べたんでしょ。だったら、どこがネックになってるか
わかってるんじゃないの。そのネックをどうやって解消するべきか考えたら。

Oracleはあまり詳しくないんだけど、Oracle8ってルールベースとコストベース
両方できたっけ? コストベースになってるならAnalyzeはしてるよね?
それからOracleはデフォルトでfrom句に書くテーブルの順番って関係あるん
だっけ? 関係あるのなら絞り込みしたい順番にテーブルを書く必要があるで
しょう。

まずは理解できなくてもチューニングマニュアルを読むことから始めましょう。
0154デフォルトの名無しさんNGNG
>152
あと、パーティションテーブルだったらパーティションキーをちゃんと結合条件に入れないと全然だめぽ。

>153
コストベースでテーブルの評価順序を規定する場合はヒント文でなんとかできます。

select /*+ orderded */ 〜って感じで。
でもあくまでオプティマイザへのヒントなんで、オプティマイザが考えたコストが低い場合は却下されまふ。
と、これは>153ではなく>152へ言うべきだったな。スマソ。
0155デフォルトの名無しさんNGNG
ここさ、変な煽りとか、AAコピペする奴とか居なくていいね。
0156108NGNG
>>155
居ないんじゃなくて、無視されてるだけなんじゃないかな……
こっちは煽ってなくても無視されてるけど。
0157144=148=152NGNG
ちょっと別件が忙しくて件のクエリーを直す暇がなくなって
きてしまいました。
今度パフォーマンスチューニングのマニュアルを読んで出直
してきます。もっとちゃんとした質問ができるようになったら
またよろしくお願いします。ありがとうございました。
0158デフォルトの名無しさんNGNG
>156
あのね、この場合は完全に本屋へ足を運んだり(あるいは本屋の検索を使う)
ググールで検索したほうが早いから敢えて誰も突っ込まないだけだよ。

今はSQL92が主流だからそれ関係で調べてみるといいかもね。
0159デフォルトの名無しさんNGNG
>158 せっかく放置してたのにぃ
0160108NGNG
ありがとうございます。

>>158
もちろん、反応を待つよりGoogleや2ch検索を使うほうが早いのでそちらを
試したあとで書いています。書いたあとも何度か別のキーワードを試しました。

Googleで検索した結果、大部分は「SQL9x準拠」という文字がひっかかっている
ようです。それらのほとんどはMySQLやPostgreSQLやDB2やOracleや……の
ドキュメントのコピーが検索されているものです。あとはWebチュートリアル
もありました(が、入手法は書いていない)。
要点はこの二つです:

- 購入するしかないのかどうか (「ない」ことを調べるのは難しい)
- 電子化されている資料があるのかどうか

>>159
宿題終わってないんですね?
0161デフォルトの名無しさんNGNG
primary keyとなっている列名を取得するSQL文を教えてください。
環境はWindows2000、SQL Plus9.0です。
0162デフォルトの名無しさんNGNG
>161
Oracle だったらuser_cons_columns,user_constraints
から引き出せば。プライマリだったら
user_constraints.CONSTRAINT_TYPE='P'で。

0163161NGNG
>>162
どうもです。
0164デフォルトの名無しさんNGNG
シツモンヌ
オラクル8.1.7からサイベースDBを参照することは出来ますか?
0165デフォルトの名無しさんNGNG
>>164 サイベースDBってなんだよ、旧SQL Serverのことか?
0166デフォルトの名無しさんNGNG
>>165
SyBaseじゃなくてか?
0167デフォルトの名無しさんNGNG
>>164
7,8年くらい前は結構メーカの異なるDBへの接続製品が話題になってたけど、
最近は全然聞かないなあ。あんまり需要がなかったのかな。

Googleで「Oracle Sybase 異機種 接続」で検索したらいくつか出てきたぞ。

>>165
おそらくSybase ASEのことでしょ。
0168デフォルトの名無しさんNGNG
そんなことやるなんてわざわざ災いの種バラまいてるようなもんだ
0169デフォルトの名無しさんNGNG
サイベースDBじゃ通じないのか。
うん。sybaseASEのことでございます。
ともあれ>>167氏thx

>>168
オラクル側にASE上のテーブルのビューを作りたいのさ。
0170デフォルトの名無しさんNGNG
>>160
http://www.google.com/search?num=50&hl=ja&ie=Shift_JIS&q=SQL99+%8BK%8Ai%8F%91+%93%FC%8E%E8&btnG=Google+%8C%9F%8D%F5&lr=lang_ja
0171167NGNG
>>169
Sybaseと聞いてASEだと思ったらASAだったりすることがあるからじゃ
ないかな。
0172デフォルトの名無しさんNGNG
>>160
どっかでまったく同じ質問見たような気がする
0173108NGNG
>>170 すばらしい。
そうか、「規格書」なんですね…… なんで気づかなかったのだろう。
さっそく読んでみます。ありがとうございます。
>>172 UNIX板のMySQL/PostgreSQLスレじゃないかと思います。
0174デフォルトの名無しさんNGNG
>>173
なんというか、まっ先にANSIのWEBサイト見に行こうと思わなかったのかなぁ?
電子文書化されているのか、はたまた有料なのか、それらの疑問は一発で
解決しただろうに・・・

最近はSQL92 & Core SQL99のリファレンス・ハンドブック(日本語で解説)が
\3,000程度で出版されているよん(題名忘れたけど・・・)
0175デフォルトの名無しさんNGNG
>>173
まぁ、そのなんだ、、、「マルチですよ」って宣言した時点で放置は決定していると思うが?
0176108NGNG
>>174 www.ansi.orgにいって検索してみましたが一件もみつかりませんでした。
>>175 「マルチ」とは?
0177デフォルトの名無しさんNGNG
> 「マルチ」とは?
ネタか釣り決定放置
↓ネタではないですよ
0178デフォルトの名無しさんNGNG
>>176
> www.ansi.orgにいって検索してみましたが一件もみつかりませんでした。
ネタだよな?
マジだと"私は上っ面しか見てません"と公言しているようなもんだよ
0179デフォルトの名無しさんNGNG
WIN98からSQL2000につながらないのはなんで?
0180デフォルトの名無しさんNGNG
>>179
なんでだろう? 気合が足りないとか♪
0181デフォルトの名無しさんNGNG
>180 きっと電圧が足りないんだyo!

>179 だから詳しく状況を(略
0182デフォルトの名無しさんNGNG
>>179
1)コンセントは刺さっていますか?
2)コンピュータの電源は入っていますか?
(正面のランプが緑色に点灯していますか?)
3)ディスプレイ(テレビのような画面のことです)は電源が入っていますか?
0183デフォルトの名無しさんNGNG
>180
違うよ。足りないのは、きっと愛だよ。
0184デフォルトの名無しさんNGNG
>>180->>183
かなり釣れたなw
0185デフォルトの名無しさんNGNG
ネタレスでもつれたというのだろうか。
0186デフォルトの名無しさんNGNG
>>185
釣られたのは君だYO!
0187デフォルトの名無しさんNGNG
>>176のショボイとしか言いようのないゴミを捨てといて釣りとはおめでたい
レス4個程度で>>184のように"かなり"という表現を使うあたり相当おめでたい
ハッピーハウスにでも逝ったら? ショボイ奴はとことんショボイな(藁

・・・って、ここはネタスレだったっけ?
0188デフォルトの名無しさんNGNG
前スレは良スレだったのに
0189デフォルトの名無しさんNGNG
>188
最近まではここもマターリしてたよ。
0190108NGNG
>>178 使いかたがまずいのでしょうか。
searchのリンクから検索ページにいって「SQL92」だと0件。
「SQL」だと求職っぽい内容のを含めて13件。そのうちに
目的の情報なし。

>>177
- まったく同じメッセージを複数のスレッド/板にまたがって貼っている宣伝業者と、
- 情報収集の進捗を書きつつ、より適切と思った板に移動して質問した人
を同じふうに「マルチ」と書いていた(ようだった)ので、どういう意味に
使っているのか確認しようとしたわけです。

>>187 ネタとか煽り(と他の人がいっている)メッセージがあるから
といって、自分が何でも書いていいという理由にはならないこと
ぐらい理解できないのかな?
0191デフォルトの名無しさんNGNG
>190
結局何? Webで読めるところを探してて、見つからなそうなら書籍を買うってこと?
サーチに手間取ったりするなら買ったほうが明らかに安いし、
Web探してる時間を勉強に充てられるんだから効率いいよ。

これ以上は荒れるだけだからもうやめてほすぃ。
0192デフォルトの名無しさんNGNG
>>190
public/search.aspで検索したってことなのかな?
そこの断り書きをちゃんと読んでるのかね
規格を探すためのポインタが示されてなかったか?
0193デフォルトの名無しさんNGNG
ANSIじゃなくてもJISCを探すという手もあるのに。
少なくとも「閲覧」は無料でできる。

というか、>>191さんに同意。
0194デフォルトの名無しさんNGNG
>>190
とあるスレに投げかけた質問/問題が放置されたからといって
己の主観でマルチポストしていいという理由にはならないこと
ぐらい理解できないのかな?

宣伝、情報収集等その目的を問わず、マルチポスト(=複数投稿)という
行為には変わりはないゆえに同類として扱われる
# 板/スレ住人に適切なスレへの誘導をされた場合を除く
0195デフォルトの名無しさんNGNG
ドキュメント読む前に、空気を読む人間に成長したほうが、
実りある人生をおくれるとおもうよ。
本気で。
0196デフォルトの名無しさんNGNG
>>179
接続に使うプロトコルはWIN98にもあるか?
例えばSQL2000のサーバがTCP/IPでWIN98がNetbiosだけとか間違ってね−か?
0197デフォルトの名無しさんNGNG
t1
uid name
1 a
2 b
3 c
t2
uid name
1 ab
3 cc
3 cc
というデータがありまして、t2.uidにデータが存在するt1.*(この場合は
uid1と3のみ)を取得したいと思うのですが、
select t1.* from t1,(select uid from t2 group by uid) as t2 where t1.uid=t2.uid;
と現在考えているのですが、もっとスマートな方法をどなたかご教授頂けないでしょうか?
0198デフォルトの名無しさんNGNG
>197
スマートって何よ? 他に方法ないじゃん。
変えてもexists使うとかinを使うとかしかできないよ。
これくらいのクエリでスマートさを求めるより、
インデックスの張り方とかを考えたほうがいいとオモワレ
0199197NGNG
>>198
いえ、全く速度面とかに問題があるのではなくて、何かやりたいことに
ぴったしはまった結合があったように思えて夜に寝てしまいました。
select t1.* from t1 include join t2;
くらい短く書く方法が・・・あったような気がするだけな気がしてきました。
無いという答えが自分の中に明確に無かったので、
言って貰えて助かりました。ありがとうございました。
0200198NGNG
200!

>199
なるほどね。コードに疑念を持つことは良いことだよ。
でも疑心暗鬼にならないようにほどほどでキリをつけるのも一考だね。
0201デフォルトの名無しさんNGNG
>>197
exists
0202デフォルトの名無しさんNGNG
困ってます!困ってます!助けてください!!

文字列の引用符として’を使っている構文で文字列の中に’があった場合、どうやって記述すればよいのでしょう??
よろしくおながいします。
0203デフォルトの名無しさんNGNG
>201
ガイシュツ
0204デフォルトの名無しさんNGNG
>202
死ね
0205デフォルトの名無しさん NGNG
>>203 204
怖い人たちだなぁ...

>>202
DBエンジンによって違うよ。
'⇒''って変更してみたり、'⇒\'って変更してみたりしてみそ
0206デフォルトの名無しさんNGNG
ORACLEのPL/SQLで、SQLからUNIXのシェルを実行させたいのですが、
どうやればできるのでしょうか?
やっぱり無理なのかな。
0207デフォルトの名無しさんNGNG
>>206
興味があったんで調べたが、非常に難しいらしい。
つーか純粋にシェルを呼び出す事はできないみたい。
ttp://members12.cool.ne.jp/~yoshi0915/oracle/000831/20437.html
0208デフォルトの名無しさんNGNG
なんでそんなアホな仕様しか思いつけないのか
0209デフォルトの名無しさんNGNG
そーいえば、SQL*Plusのコンソールから
シェルのコマンド叩ける方法があったような気がしたが
なんだっけか?
#なんか急に知りたくなった。。。。
0210デフォルトの名無しさんNGNG
>209
!
0211209NGNG
>>210
エクスクラメーションじゃ出来なかったぞな。
気になってマニュアルまで調べてしまったが
host ダタヨー
ちなみに、Win2kでOra817な環境ね。
SQL*PlusはGUIなヤシ
0212デフォルトの名無しさんNGNG
>>211

UNIXのsqlplusは!だね、今でも。
oracle9iでそうだった。
0213デフォルトの名無しさんNGNG
select price from pricetable where id = 12

って

pricetableからidが12のpriceを取得する

ということですよね?
0214デフォルトの名無しさんNGNG
>213
入門書嫁。
つか試した方が早い。
0215デフォルトの名無しさんNGNG
SELECT DISTINCT ON (location) location, time, report
  FROM weatherReports
  ORDER BY location, time DESC;

PostgreSQLのマニュアルにある例なんだけど、
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.1-ja/sql-select.html
この例だとLocationの重複を取り除いた天気Reportが
Locationのアルファベット順に出てきますよね。
これをLocationの重複を取り除いて、timeが新しい順に
取得したい場合はどうすればいいのですか?
0216デフォルトの名無しさんNGNG
改行とかインデントが無くなったSQLの整形ってみなさんどうしてます?
Accessのクエリって勝手に改行消すからいちいち改行して解読するんですが。
フリーのソフトも探してみたのですがイマイチしっくり来なくて。。
ちなみに見つけたモノです↓
ttp://www.cypress.ne.jp/iceprobe/sqlice/
ttp://www2.freejpn.com/~az0652/softwares/splcnv.htm
0217582NGNG
>197

なんでそんな回りくどい、アホなqueryしてんだ?
group byなんてそんなんで使うか?普通。

>198
>199
無くねーよ。

select * from t1
where
uid in (select distinct uid from t2)

でええやん?
>197 の仕様なら。
0218デフォルトの名無しさんNGNG
>>215
ORDER BY句からlocation引いて、「ORDER BY time DESC;」
でだめなの??
0219デフォルトの名無しさんNGNG
BETWEEN で、たとえば1000から最大値を指定する場合どうすればよいですか?
0220219NGNG
解決しました。
0221デフォルトの名無しさんNGNG
sqlserverでのoracleの
select * from tab
と
desc
を教えてください。
0222デフォルトの名無しさんNGNG
まずあなたの国の言葉を教えてください。
話はそれからです。
0223そもそも…NGNG
>> 219
1000以上"って条件じゃだめなのかな?
'最大値'っていうのがクセモノだな・・・。
そいつはもしかして、値が指定されたらその値で、指定されなかったら
最大値でってことかな?。(ホスト言語からSQLを発行するような場合
渡河) であれば、状況によってSQL文を切り替えることも出来るはず。
BETWEENにこだわる理由は何かな?
0224そもそも…NGNG
>>223
解決してるジャン。あほでした。m(__)m
0225221NGNG
早く教えて!
0226デフォルトの名無しさんNGNG
>221
>225

初等教育受けなおしてきた方がいいんでない?(w
0227コンパイル成功!?NGNG
>221 のソースコードをコンパイルしてみました。

『Oracleにおいて、SQL文「select * from tab」を発行
すると得られる情報と同様の情報を、SQL Serverで
得るにはどういうSQL文、或いは、コマンドを発行す
ればいいのでしょうか。 教えてください。』

しかし、私の実行環境(脳ミソ)ではコアを吐いてし
まいました。

お粗末でした。

以上です。
0228デフォルトの名無しさんNGNG
同じ質問を SQL vs ora スレで見た気がする
0229デフォルトの名無しさんNGNG
てかFAQだよ。
ヒントはsp_・・・
0230デフォルトの名無しさんNGNG
抽出したレコード群1に対し、サブクエリを使って別のレコード群2を結合させ、1回のSQL発行で
必要な全てを抽出するのと、いったんレコード群1を抽出し、都度SQLでレコード群2を抽出する
ようプログラムを書くのとどちらがパフォーマンスがよいですか?
なほ、何件ヒットするかは不明です。数件かも知れないし数万かも
0231デフォルトの名無しさんNGNG
もっとお母さんみたいに言ってくれ
0232デフォルトの名無しさんNGNG
>>230
きちんと実行計画みたらわかるんじゃん?

で、どちらでもきちんと適切と思われるINDEXを使用しているならば
たぶん1発の方が多少なりともコストは低いと思われ。
SQLの書き方にもよるが、複数回SQL文を発行すると
オプティマイザでの解析処理が複数回走ってしまう可能性があるので。
あと、何らかの言語でループさせて複数回SQL文を発行するんだろうけど
その分のコストもある死ね。
0233デフォルトの名無しさんNGNG
>232
どうもです。
実行計画なるもにその情報があるわけですね。これはチト勉強が要りそうですね
「一発の方が多少なりともコストが低いと考えられる」ということですが大変参考になります。
ありがとうございます。

ちなみにアドバイス随時募集です(^^;
ちょ〜亀レスでも良いです。よろ。
0234デフォルトの名無しさんNGNG
>217
ちゃんとレス嫁。
>198にて、『変えてもexists使うとか「in」を使うとかしかできないよ。』
と書かれてる。
大体、distinctを使う時点で厨房なのに、口調だけ偉そうなのは止してくれ。
0235デフォルトの名無しさんNGNG
group byだって高いやん?>234
mysql並のsql文でやれることでもないやん。

で、君ならどんなquery書くの?
0236234NGNG
>235
漏れはt1がユニークインデックスと前提にして考えて、

select * from t1
where
uid in (select uid from t2 group by uid)

と書くと思う。
ハッキリ言って、t1とt2のテーブルの規模が解らないからあくまでひとつの回答でしかないけど。
それにデータ量によってはオプティマイザによって、>197と同じ式に展開されて
サブクエリ側の結果表を先に作ってネステッドループさせるようになると思うし。

で、distinctとgroup byは結果表の作り方が異なるじはずだが、
少なくとも1000万件くらいのデータで実測して言ってるよね?
コストが少々高くてもアクセスバイト数やインデックスの使われ方によってはベラボーに速いはずだけど。
0237デフォルトの名無しさんNGNG
取得結果のたとえば3行目〜7行目だけ限定するようなことはできるのでしょうか。
select * from hoge where rownum>2 and rownum<8
のような意味合いなのですが、rownumをこういうふうには使えなかったので…
0238デフォルトの名無しさんNGNG
>>235-236
このケース、そもそもdistinctもgroup byも必要ないけど。
サブクエリを先に評価するようオプティマイザを誘導する場合でも
俺はそうは書かないな。

> distinctとgroup byは結果表の作り方が異なる
まじ?

>>237
select *
from (select hoge.*, rownum num from hoge)
where num between 3 and 7
0239デフォルトの名無しさんNGNG
>236

>少なくとも1000万件くらいの
(*´Д`*)Pu...
こんな厨房質問する奴がそんな案件携わったるわけないやん。
、と思いたい。

だいたいそんな大きいデータ量でネステッドループですか・・・

groupとuniqueでgroupの方が早いか?
DBなに使ってんの?ボラ駐っぽいな・・・

つーか、データ量が多けりゃindex使えなんて、何当たり前のこと
嬉しそうに言ってんだ・・・

distinct(unique)を使う時点で厨房だそうですYO!皆さん。
扱うデータ、スキーマによるとか(また当たり前のこと
言い出さないでね。

>238
joinしてis not nullでもする気?
取り合えず、書いて見れ。
0240デフォルトの名無しさんNGNG
>>239
joinなら必要だけど、in(query)でしょ。exists(query)といっしょ。
0241デフォルトの名無しさんNGNG
そうそう。
#まぁ、query planが一緒かっつーと違うだろうけど。
で、!使わずに!考えてみたんだけど。

>238 == 240 ?
の言ってる効率のいいqueryみてみたいんで、
取り合えず、書いてミレ。
0242238,240NGNG
>>241
a) select * from t1 where uid in (select distinct uid from t2);
b) select * from t1 where uid in (select uid from t2 group by uid);
c) select * from t1 where uid in (select uid from t2);
d) select * from t1 where exists (select * from t2 where t2.uid = t1.uid);
この4つの結果が同じってのはおけ?

んで、効率かぁ。
existsを使った場合は必ずメインクエリから評価されるけど、
inだとオプティマイザが評価順序を選択できる。

俺習慣だと、
t2.uidにインデックスが切ってないとか、
t1のレコード数 >> t2のレコード数とか、
t2がリモートデーターベースにあるとかで、
サブクエリから評価して欲しい場合にしかinは使わないな。

その場合は、
select * from t1 where uid in (select uid+0 from t2);
って書いてる。残りは全部exists使ってる。

a)、b)みたいに書いたほうが効率がいいケースてのは…ある?
0243241NGNG
>242
Miguel de Icazaの記事読んでて眠くなったので明日レスするぽ。

http://www.os-omicron.org/~takano/private/trans/bongo-bong_j.html
0244241NGNG
>242
戻ってきたよ。
眠気眼なんですが、だいたい分かったポ。

>a) select * from t1 where uid in (select distinct uid from t2);
>b) select * from t1 where uid in (select uid from t2 group by uid);
>c) select * from t1 where uid in (select uid from t2);

上の2つはだいたいoptimizeされて一緒だろうけど、
#たぶん、データ量にもよるけど(;´ω`)
a>b>cの順になると思うぽ。cは無駄な比較がでる。
データ量が小さければuniqueさせるコストも低いし、大きい場合は
比較時に有利。a>bは実測からもわかる。

dは、nested loopされるっぽいけど、
t1*t2の行数回、比較が行われるので処理対象のデータ量多い場合
向かないと思うな。小さい場合はd > c > a ではないかな、と。

dとaの損益分岐点はどの辺にあるのかはわかりませんが。
0245242NGNG
>>244
cをt1から評価する場合はd、t2から評価する場合はaに
暗黙に変換してるんでないかと漠然と思ってたんだけど、
よくわからんw

c→aの変換が行われないとすると、t2.uidのユニークさ加減
によってc > aだったりa > cだったりするんかな?

> dは、nested loopされるっぽいけど、
> t1*t2の行数回、比較が行われるので
existsは条件に合致したレコードが見つかった時点で評価終了
でなかったけ?

例えばサブクエリのwhere節を外して、
select count(*) from 100万件なテーブル
where exists (select * from 100万件なテーブル);
とやってもかなりのスピードで帰ってこない?

なもんで、サブクエリの参照にインデックスが使える場合は
問答無用でexists使う習慣がついてる。

なんにせよもつかれ。続きは明日以降。
0246237NGNG
238さん、ありがとう(>_<)
0247237NGNG
ageてしまった…スンマソン
0248236NGNG
>239
スマム。235がでかい口叩いたので釣られて基本事項を挙げてしまいますた。
元々の出題をしたほうは大きい案件に携わっているとは思ってないYO!

DBはOra。
テーブルでかくても(t1を)ユニークインデックスでスキャンするよう持っていければ
existsでサブクエリ側(t2)をインデックスレンジスキャンさせるよりは格段に速いっす。
0249デフォルトの名無しさんNGNG
selectしたtableBテーブルに日付を追加して、tableAにinsertしたいのですが
どのように記述すれば良いでしょうか?
お願いします

insert into tableA select itemA,itemB,(ここにsysdateを入れたい) from tableB where id='1';
0250デフォルトの名無しさんNGNG
>>249
入れたいなら、入れろよ。
入れてエラーが出るなら、それを書け。
0251249NGNG
>>250
レスありがとうございます
記述のしかたがわからないんです・・・
insert into tableA select itemA,itemB,sysdate from tableB where id='1';
と書くと、
ERROR 1054: Unknown column 'sysdate' in 'field list'
0252そもそもNGNG
>>251
sysdateって、関数なのでは?
insert into tableA select itemA,itemB,sysdate() from tableB where id='1';
でどうでしょ?
■ このスレッドは過去ログ倉庫に格納されています