X



トップページDB@2ch掲示板
1002コメント330KB
SQL質疑応答スレ 17問目 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2016/07/10(日) 22:29:01.40ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。

質問するときはDBMS名を必ず付記してください。

【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明

前スレ:
SQL質疑応答スレ 16問目
http://echo.2ch.net/test/read.cgi/db/1447160858/
0492NAME IS NULL
垢版 |
2017/08/25(金) 21:46:33.91ID:PpXsPpW0
>>491
仮定での回答ほどたいへんなものはない。
0493NAME IS NULL
垢版 |
2017/08/25(金) 22:44:29.27ID:???
>>486
>>487
いや、485にも書きましたけど、SQLのWithですって。
VBAのWith〜End WithのWithじゃないです。

>>488
そのWithです。
Excelスレって、そっちの人達じゃわからないですよ。
あと、DBサーバーとかDBドライバって、
使えるかどうかは、それに依存するんですか?
0494NAME IS NULL
垢版 |
2017/08/25(金) 22:47:33.44ID:???
WITHなら分かるけどWithは分からないにゃあ
0495NAME IS NULL
垢版 |
2017/08/25(金) 22:52:13.60ID:???
>>494
!?
SQLって小文字使えるでしょ!?
少なくともExcelなら、SelectとかFromとか、小文字使えますよ。
0497NAME IS NULL
垢版 |
2017/08/25(金) 23:44:55.40ID:???
>>485
相手のDBMSによるので最低限何のDB使ってるのか書け
接続方法等によってSQLの発行方法が微妙に違うからそれも書け
0498NAME IS NULL
垢版 |
2017/08/25(金) 23:52:02.00ID:???
自分が分かっていない事を分かっていないんだろうから何を言っても無駄
0500NAME IS NULL
垢版 |
2017/08/26(土) 00:09:13.03ID:???
ネズミをいたぶる猫を連想してしまった
0501NAME IS NULL
垢版 |
2017/08/26(土) 00:15:40.58ID:???
>>493
推測するに、ODBCかなにか使って、外部のDBを扱いたいのだろうと思う
その場合、外部のDBが何であるか、例えばOracleとかMySQLとか
そして、そのDBに対してどのような接続方法をするか、
質問する際にそういう情報として出さないと、誰も回答しようがないと思う
Withが使えるかどうかは、相手次第
0502NAME IS NULL
垢版 |
2017/08/26(土) 00:15:43.45ID:???
ネズミをいたぶる猫を見て笑ってる人がいるときいて
0503NAME IS NULL
垢版 |
2017/08/26(土) 00:34:58.63ID:???
>>493
ExcelスレってのはExcelのVBAスレな

>使えるかどうかは、それに依存するんですか?
依存する場合もあるし、君が何か間違えてる可能性もある
そもそもサーバー側がサポートしてないケースだってあるだろ
エラーが出てるならそのエラー内容も含めて関連スレで聞きな
SQLの文法でエラーになってるならここで聞けばいいけど
0504NAME IS NULL
垢版 |
2017/08/26(土) 00:39:32.94ID:???
お前らの優しさを見習いたい
0506NAME IS NULL
垢版 |
2017/08/26(土) 01:06:14.63ID:SWywwfsW
ExcelのシートにADOで繋いでクエリかけたいとかなら無理だぞ
VBA使ってるなら文字列生成を工夫して省力化できるかもしれんが。
ちなみにWITH句もしくはCTE(Common Table Expressions)といったほうが通じる
0507NAME IS NULL
垢版 |
2017/08/26(土) 12:21:03.06ID:???
>>501
完全に間違った推測ワロタw
しゃべるなバカw
0508NAME IS NULL
垢版 |
2017/08/26(土) 12:23:51.10ID:xlgNQVZl
>>507
おまえ、質問者だろ?

前もそういう態度だったよな?
0509NAME IS NULL
垢版 |
2017/08/26(土) 12:26:29.08ID:???
>>508
違うわw
質問に群がる教えたがりのバカを笑ってるだけだw
お前みたいなバカなw
0512NAME IS NULL
垢版 |
2017/08/26(土) 14:47:34.48ID:???
まあ確かにこの質問者は態度悪いな
0513NAME IS NULL
垢版 |
2017/08/26(土) 18:30:27.89ID:???
「態度」じゃなくて「頭」な
0514NAME IS NULL
垢版 |
2017/08/26(土) 19:51:42.90ID:???
>>497
>>501
相手方は、AccessかExcelかCsvです。
接続方法は、MsQueryかADOしか分かりません。

>>503
そのExcelのVBAスレなんですけど、
そっちは、普通の使い方をする人がメインで、
SQLとかWindowsAPIとか、マイナーなのはあんまり話が通じない・・。

ここも、WithがSQLのWithだとわからないで攻撃してくる人がいましたけど、
あっちはもっと酷いです。

>>506
無理なんですか・・。
ありがとうございました。
0515NAME IS NULL
垢版 |
2017/08/26(土) 20:02:14.73ID:UyefH8h9
>>512,513
お前らの頭なw
なんでバカのくせに教えたがるの?w
0516NAME IS NULL
垢版 |
2017/08/26(土) 20:08:01.94ID:fS1lbmBN
「話が通じない」んじゃなくてお前の書き方がヴァカなんだよ
0517NAME IS NULL
垢版 |
2017/08/26(土) 20:12:57.75ID:UyefH8h9
>>516←自分のバカをバカにされてバカにしてる奴が質問者だと思いこみたい救いようのないバカw
0518NAME IS NULL
垢版 |
2017/08/26(土) 20:19:19.21ID:xlgNQVZl
>>514
そもそもあなたの言葉は非常にわかりにくく、大半の日本人は理解できませんよ?
0519NAME IS NULL
垢版 |
2017/08/26(土) 20:20:33.40ID:xlgNQVZl
言い方が悪いけど、頭の悪い女性が書く文章に似ている。
0520NAME IS NULL
垢版 |
2017/08/26(土) 20:33:35.52ID:UyefH8h9
>>519
だから悪いのはお前の頭だと何度w
とはいえすかさずバカ特有の論理性を欠いた女性蔑視発言をねじこんでくるあたりはさすがだなw
バカオブザバカの称号をお前に授けようwww
0521NAME IS NULL
垢版 |
2017/08/26(土) 22:13:59.42ID:5aHU4Upa
第三者がかたわらでわめいている構図w
0522NAME IS NULL
垢版 |
2017/08/26(土) 23:00:21.75ID:???
いつものクズがVBAスレから出張してきててワロタwww
0523NAME IS NULL
垢版 |
2017/08/27(日) 08:01:00.92ID:???
>>518
それはそうです。
分かる人(Withというキーワードだけでピンと来る人)に向けて書いてますから。
0524NAME IS NULL
垢版 |
2017/08/27(日) 08:24:00.98ID:???
with自体について突っ込まれているんじゃないってことすら読み取れないのか。
ざっと見まわしても>>494ぐらいしか見当たらんけどな、そういうのは。
0525NAME IS NULL
垢版 |
2017/08/27(日) 10:06:46.09ID:QBQ1on1X
>>523
だから、どこでSQLのwith句をどう使おうとしているのか、どう書こうとしているのか、頼むから書いてくれ。
0526NAME IS NULL
垢版 |
2017/08/27(日) 11:43:26.86ID:???
そうやって甘やかすから図に乗るんだよ
0527NAME IS NULL
垢版 |
2017/08/27(日) 13:17:12.26ID:???
暇な人(分かるとは言っていない)だけが答えてますから。
0528NAME IS NULL
垢版 |
2017/08/27(日) 18:58:25.87ID:???
>>525
>相手方は、AccessかExcelかCsvです
らしいから、Jet(ACE)だろ
少なくとも俺の知るバージョンではCTEは使えないから
回答として、できないで終了でいんじゃね
0529NAME IS NULL
垢版 |
2017/08/27(日) 20:18:39.07ID:???
質問者の態度が悪いから終了済み
0530NAME IS NULL
垢版 |
2017/08/28(月) 19:51:37.55ID:???
Excel VBAスレにいるいつもの奴だからスルーで
自分で質問して自分で回答してる奴ね

お前らどうせ分からないだろ、俺が一番詳しい(キリッ
って態度で質問してる

誰かが回答するとすぐ回答者を装って嫌違うってレスしてくるからすぐわかるぜ
0532NAME IS NULL
垢版 |
2017/08/28(月) 22:52:26.60ID:XdLa3rwF
>>530
だからそのwithじゃなく雑誌のwith
0533NAME IS NULL
垢版 |
2017/08/31(木) 16:21:53.66ID:eqJ9vJSf
>>1
【緊急】
すき家の定食に衝撃異物!
ずさんな管理体制が明らかとなった
指摘したその時!わざとらしく店員が声をあげごまかした!

229 名前:やめられない名無しさん [sage] :2017/08/29(火) 07:31:54.64 ID:EfhOnUp0
俺の朝はいつもすき家
楽しみにしてたのに・・今日に限って朝定食にしたんだ

見てくれ、これが証拠
店員さんも驚いて声をあげてる・・
https://www.youtube.com/watch?v=wjD4hUeU-CA

ちなみに半分食べた
お客様センターが通じない・・病院行く・・
(´・ω・`)すき家が大好きだったのに・・
0534NAME IS NULL
垢版 |
2017/09/02(土) 17:24:26.40ID:fn9CT/Jy
LEFT JOINで結合した際に、対応するレコードがない場合
値がnullになりますが、元のテーブルのデフォルト値にするにはどうしたら良いでしょうか?
SELECT句で各clumnにIFNULLは使いたくないです
MySQLを使っています
よろしくお願いします
0535NAME IS NULL
垢版 |
2017/09/02(土) 18:09:41.53ID:???
LEFT OUTER JOINの話かな?
どっちにしろ、そんな方法はない
IFNULLで地道に埋めるしかない
0536NAME IS NULL
垢版 |
2017/09/02(土) 18:24:43.00ID:???
>>534
CASE式、COALESCE、IFNULL, サブクエリ、デフォルト値有りの一時テーブルへINSERTとかかな
IFNULLを使いたくない理由が手間のみなら諦めたほうがいい
真っ当な理由があるならCASE式での代替を考えるといいのでは
0537NAME IS NULL
垢版 |
2017/09/02(土) 18:26:33.96ID:fn9CT/Jy
>>535
>>536
そうですか・・・
clumnの数がかなりあるので糞面倒ですが地道にやります
ありがとうございました
0538NAME IS NULL
垢版 |
2017/09/02(土) 18:45:22.86ID:???
ソース全部手で打ち込んでいるのか?
環境が分からないけど、
大概のエディタって置換機能あるだろう
0539NAME IS NULL
垢版 |
2017/09/02(土) 19:42:16.80ID:???
単純な繰り返しならエクセルの計算式でsql文作ってコピペすれば楽チン
0540NAME IS NULL
垢版 |
2017/09/02(土) 19:57:29.59ID:???
すごくたくさんあるならSQLを生成するスクリプトを書くとか
0541NAME IS NULL
垢版 |
2017/09/02(土) 21:09:40.84ID:???
SELECT *, "default" AS [name] FROM foo

こんな感じでfooテーブルのレコードに任意の値をくっつけたものを出力可能
NOT EXISTSとかのサブクエリと組み合わせて、EXISTS側とUNIONで合体する
自分ならまずやらない方法ではあるが

単発のSQLじゃなくアプリケーションで使うSQLだとすると
DB設計かアプリケーション設計かどっちか考えなおしたほうがいいかもね
0542NAME IS NULL
垢版 |
2017/09/02(土) 23:03:08.61ID:???
「かなりある」とか言ってても実際は大したことない
0543NAME IS NULL
垢版 |
2017/09/02(土) 23:18:50.28ID:???
CentOS6 + mysql 5.57
社のシステムなので、アップデートやインストール、ログ設定の変更ができない前提です。

まず前置きですが

既存のデータをDB化する一環で、大量(毎日80000行)くらいのinsert文を実行しなければなりません。
insert文自体は、既存のテキストデータから必要事項を抜き出して私が組み立てています。
元のデータはwindowsだったりワープロ専用機だったりですが、最終的に全てUTF-8に変換しています。
まぁこの処理自体はマクロ等駆使してやっているので問題がないのですが、元々のテキストに本来SQLで避けなければならないような半角記号とかが含まれている可能性がありますが、そこまでのチェックは物理的にできません(やっていません)。
一応、改行を\n、半角の引用符号は全角に、程度の処置はしています。
で、この大量のテキストをsource文で読み込んで処理するのですが、所々warning**みたいな表示がでているのがわかります。
登録済み行数のチェックくらいはできますが、フィールドの中身が正しく登録されたかどうかまでのチェックはとても手が回りません。

そこで質問なんですが、SQLを実行する前にエラーになりそうな箇所を知る方法、あるいは、実際にエラーやwarningが出た行を知る方法(ツール、設定)がないでしょうか。
0544NAME IS NULL
垢版 |
2017/09/02(土) 23:37:05.01ID:???
改行コードを入れてはいけないとか
引用符を入れてはいけないとか
そんな「俺ルール」はDBにとっては知ったこっちゃないので
まずはその「俺ルール」を正確に定義しないと何も始まらない
0545NAME IS NULL
垢版 |
2017/09/02(土) 23:57:36.86ID:???
>>543
エラーが出た行が分からない理由がよく分からない

自分ならINSERTじゃなくインポート(LOAD)使う
8万行くらいならよっぽどレコード長が長くない限りすぐ終わる
でDBからデータをエクスポートして元データと差分比較して検証する
検証が完了したらインポート先のテーブルから本番テーブルへデータ移行する

まあ100件くらいの少量でやり方を確立してから本当に必要な量でやったほうがいいよね
0546NAME IS NULL
垢版 |
2017/09/02(土) 23:58:49.02ID:???
あとSQLの質問じゃないしMySQLスレで聞いたほうがいいんじゃないの?
0547NAME IS NULL
垢版 |
2017/09/03(日) 00:25:28.93ID:???
エラーハンドリングのやり方がわからないという意味なのかな?
それなら製品ごとにやり方違うからMySQLスレで聞いたほうがいいと思う
0548NAME IS NULL
垢版 |
2017/09/03(日) 08:08:16.34ID:???
>>543
> そこまでのチェックは物理的にできません(やっていません)。
やれよ...
チェックすべきなのは
https://dev.mysql.com/doc/refman/5.6/ja/string-literals.html
表 9.1 特殊文字エスケープシーケンス を参照

> 実際にエラーやwarningが出た行を知る方法(ツール、設定)がないでしょうか。
tee と warning コマンドで全部出力すればいいだけだろ

まあ何度もやるなら>>545の言うようにLOAD(もしくはそれをラップしたmysqlimportコマンド)を使うべきとは思う
https://dev.mysql.com/doc/refman/5.6/ja/mysqlimport.html
0549NAME IS NULL
垢版 |
2017/09/03(日) 09:18:14.94ID:???
>>543
>チェックはとても手が回りません。
なんで?時間が無い、技術が無い?
0550NAME IS NULL
垢版 |
2017/09/03(日) 10:57:23.38ID:O1ZU9t9T
もうSQLというより、IT技術者の初心者の質問だよなw
0551NAME IS NULL
垢版 |
2017/09/03(日) 11:54:28.53ID:???
計算機科学者と宇宙飛行士ってどっちの方が頭いい?
0552NAME IS NULL
垢版 |
2017/09/03(日) 21:49:26.78ID:O1ZU9t9T
>>551
宇宙飛行士は頭がいいというよりは、超絶バランス感覚がある人でないとできない。

頭が良すぎる人には向いてない。
0553NAME IS NULL
垢版 |
2017/09/04(月) 03:07:24.06ID:???
自分は生まれつきもの凄く頭が悪いのですが、東京大学理学部数学科に入って数学を学びたいという目標があります。
生まれつきもの凄く頭が悪い人でも、人並み外れた努力を積み重ねれば、その目標を実現することはできると思いますか?
どうでしょうか?
0554NAME IS NULL
垢版 |
2017/09/05(火) 23:16:20.77ID:fWoFV/f/
>>553
東京大学に入ることは努力で可能なことです。そんなに難しいことではありません。

高校生までに東大に合格するような勉強方法や、強い意志がみなないだけです。
0555NAME IS NULL
垢版 |
2017/09/06(水) 00:06:04.88ID:???
ネカフェで三田紀房の ドラゴン桜 でも読んどけ
0556NAME IS NULL
垢版 |
2017/09/06(水) 19:19:21.78ID:ARdyJ0VM
それをSQLで
0557NAME IS NULL
垢版 |
2017/09/08(金) 00:26:54.83ID:???
insert into >>553(atama)
values
select エッセンス from ドラゴン桜;
0558NAME IS NULL
垢版 |
2017/09/12(火) 11:19:53.86ID:pQpjXKHz
MySQL5で1つのカラムに空白区切りの単語がはいっているとします。
テーブル構成は以下の通りです。

id|word
.1|バナナ
.2|バナナ みかん

COUNTで集計したいのですが、
空白文字で区切って「バナナ:2」「みかん:1」のようにすることって出来ますか?
(空白区切りじゃなくてカンマ区切りでもいいです)

別に単語分割したテーブルを用意するのではなく、
1つのテーブルでカラム内の値を分割して集計する方法があれば教えてください
0561NAME IS NULL
垢版 |
2017/09/12(火) 15:55:17.71ID:???
各DBでのやり方見たら分かると思うけど
そのケースをSQLで処理するためには
単語分割したテーブルを用意するのと同じような処理が必要
0562NAME IS NULL
垢版 |
2017/09/13(水) 02:52:44.62ID:xvQI2SSS
関数従属性の話って「意味論」でいいんだよね?
ある「カラムAから -> カラムB」の従属性があるかどうか
って現在のテーブルに格納されている値を見比べるだけじゃ
わからないよね?
もしカラムAとカラムBの値が全く同じ組み合わせで対応している
ように見えても、それが偶然これまではそうなだけなのかもしれないし、
「A -> B」が「値を見る限り従属している」のが分かったとしても、
それが「直接従属している」か「推移的な従属」なのかって、
値を見てもわからないよね?
カラムの意味を考えたり、値を格納している実装を見ないと
「どんな従属性なのか」ってわからないっすよね?
0564NAME IS NULL
垢版 |
2017/09/13(水) 07:50:29.57ID:???
今あるデータがすべてならばデータを見れば判断できる。
それ以外のこれから入れるデータがあるのであれば当然、今あるだけのデータからは判断できない。
0565NAME IS NULL
垢版 |
2017/09/13(水) 12:19:17.25ID:???
意味論て言ってるのにデータを見ただけで分かるわけないだろ
頭が悪い奴だなw
0566NAME IS NULL
垢版 |
2017/09/13(水) 13:05:00.31ID:xvQI2SSS
>>565
「意味論だよね?」って確認してるの。
関数従属性について図で例示されてる解説があるだろ?
でもこういうのみてもさっぱり理解できないから、よく考えたら
例示では理解しにくい概念なんじゃないかって思ったんだよ。
やはりそうなのか。
0567NAME IS NULL
垢版 |
2017/09/13(水) 15:52:20.65ID:???
うん、関数従属性はデータからだけじゃわからないよ

既存のテーブル構造が関数従属性を100%表現できている場合は
データじゃなくその構造を見ることでどういう従属性があるか理解できるかもしれないが
現実には100%表現できてることなんてまずないからね
0568NAME IS NULL
垢版 |
2017/09/13(水) 20:22:58.03ID:???
集合論を知っていればわかるように、集合自体が構造を表す。
つまり、テーブル内のデータが全体集合なのであればそこに存在する従属性はそれでわかる。
現実的には全体集合を得られていることなんてレアケースだろうから、そのときは
「(いま得られている)データからだけじゃわからない」ってことになるが。
0569NAME IS NULL
垢版 |
2017/09/13(水) 20:53:13.11ID:???
>>568
言い訳が苦しすぎんだろw

{ A , 11 , 999 , タコス , 2017/08/13 }
{ B , 12 , 777 , ドンタコス , 2017/08/14 }
{ C , 13 , 555 , ポリンキー , 2017/08/15 }
{ D , 14 , 333 , ネオポリンキー , 2017/08/16 }
{ E , 15 , 111 , ポンキッキー , 2017/08/17 }
{ F , 16 , 333 , ドストエフスキー , 2017/08/18 }

これが全体集合だったとして、ここに存在する従属性がわかるなら教えてくれよ
0570NAME IS NULL
垢版 |
2017/09/13(水) 21:11:39.20ID:???
3番目のカラムを除く組み合わせほぼ全てだろ?
Aならばタコスだし2017/08/13だし、ドンタコスならばBだし12だ。
0571NAME IS NULL
垢版 |
2017/09/14(木) 19:05:36.25ID:???
bigqueryの質問はここでいいですか?
0572NAME IS NULL
垢版 |
2017/09/14(木) 19:10:31.97ID:arvuh5Nr
質問スレで念のために自分の聞きたい質問がスレの主旨に合っているかを問うのだが
その問い自体が既にスレの主旨から外れているという矛盾を抱えた石橋叩きの人生
生きるのが大変そうですね
0574NAME IS NULL
垢版 |
2017/09/14(木) 19:53:49.43ID:???
BigQuery ってなんだ?
ってググったら Google のサービスか
何を聞きたいのか知らんけど普通に Google に聞けよ
0575NAME IS NULL
垢版 |
2017/09/21(木) 06:08:31.91ID:???
MYSQLで
まったく同じ構造の表三つを、

表1    表2   表3
1     null   1
2     2     null
3     3     3
null    4     null
5     null    5
nul    6     6

のように結合したいのですが、どのようなSQLにすればよいのでしょうか
表は三つあるのですが、どこがデータ量が一番多いのかはわかりません
0577NAME IS NULL
垢版 |
2017/09/22(金) 14:44:50.06ID:???
テーブルレイアウトも結合条件も解らんのだが
0578NAME IS NULL
垢版 |
2017/09/22(金) 15:23:28.44ID:ztnwHSNR
推測するに各テーブルがカラム1個で、
全データを列挙したいんじゃ?
0579NAME IS NULL
垢版 |
2017/09/22(金) 19:55:55.00ID:???
つまり、こういうことか?
select 表1.カラム1,表2.カラム1,表3.カラム1
from
(select カラム1 from 表1
union
select カラム1 from 表2
union
select カラム1 from 表3) t
left join 表1 on 表1.カラム1= t.カラム1
left join 表2 on 表2.カラム1= t.カラム1
left join 表3 on 表3.カラム1= t.カラム1
0580NAME IS NULL
垢版 |
2017/09/27(水) 21:42:06.33ID:???
SQL Server 2014 で教えてください。

1)
select * from tableA join tableB;

select * from tableA left join tableB;
と書いた場合、上は inner join、下は left outer join と同等でしょうか。
引き継いだコードが上のように書いてあるのですが、join で検索を掛けても inner join とかの記事しか出てこず。

2)
テーブルから特定の値のレコードを検索する場合、
a) 検索したい値を格納した(一時)テーブルと結合する
 select * from tableA t1 inner join tableB t2 on t1.id = t2.id; など /* tableB に欲しいレコードの id を格納しているとします */
b) where で in を使用して検索したい値を列挙する
 select * from tableA t1 where id in (/* 欲しいレコードの id を列挙 */)
などの方法があるように思います。

a と b の実行時間を計ると b の方が圧倒的に速いのですが、そういうものなのでしょうか。
0582580
垢版 |
2017/09/28(木) 21:07:29.31ID:???
>>581
ありがとう。

1) は動作結果からそう考えていたのですが、仕様的確認をとれて助かりました。
2) はそうですよね。SSMS の実行計画は見ていたのですが、そういう差があること以上のことは分かりませんでした。
教えていただいた方法でも調べてみます。
0583NAME IS NULL
垢版 |
2017/10/10(火) 07:06:25.79ID:???
サブクエリでのORDER BYが、メインクエリでも有効なのかどうか、
ご存知の方教えていただけないでしょうか。

例えば、学生別点数テーブルから点数上位10名を取得したい場合、

SELECT
*,
ROWNUM as num
FROM (
SELECT *
FROM 学生別点数テーブル
ORDER BY 点数 DESC
)
WHERE num <= 10;

というソースだと、
サブクエリでは学生別点数テーブルが点数の降順でソートされるはずですが、
メインクエリでROWNUMが各レコードに通番(num)を振る際にもその並びが保持されているのか。

「サブクエリの並び順って、メインクエリでは保持されないんじゃなかったか?」と質問を受け、
回答に困っている状態です。
oracle 11gのリファレンスには、ROWNUMを利用した上記SQLで、点数上位10名が取得可能と読み取れます。
「ORDER BY句を副問合せに埋め込んでROWNUM条件をトップレベル問合せに置いた場合、行の順序付けの後でROWNUM条件を強制的に適用させることができます。たとえば、次の問合せは、小さい順に10個の従業員番号を持つ従業員を戻します。」
https://docs.oracle.com/cd/E16338_01/server.112/b56299/pseudocolumns009.htm

別の箇所で質問させてもらった際は、
「サブクエリーでソートされた結果を出力するだけ(joinやwhere条件など索引に関係するものが無ければ)なら、並びを変更される要因がないので、同じ結果となる」
との回答をもらっていますが、
もしよろしければこちらの有識者の方のご意見も頂けると幸いです。

よろしくお願い致します。
0584NAME IS NULL
垢版 |
2017/10/10(火) 07:43:42.44ID:???
その回答した人は、ROWNUMがOracle固有の疑似列だということを知らなかったんじゃないかね。
ちゃんとそれがわかるように質問した?
あとOracleの場合でも、順序はROWNUMで得られるけれども出現順が保持されるとは言っていないと思う。
0585NAME IS NULL
垢版 |
2017/10/10(火) 08:19:14.50ID:???
>>583
保証されないって思っておいた方がいいと思う

> たとえば、次の問合せは、小さい順に10個の従業員番号を持つ従業員を戻します。
これは
「小さい順に10個の従業員番号を持つ従業員」を戻します
であって
小さい順に「10個の従業員番号を持つ従業員」を戻します
じゃない

> 「サブクエリーでソートされた結果を出力するだけ(joinやwhere条件など索引に関係するものが無ければ)なら、並びを変更される要因がないので、同じ結果となる」
これOracleサポートの正式回答ならとりあえずは信じていいと思うけど、バージョン変わった時も保証されるのかを聞いておいた方がいいと思う

そもそも普通に
order by num asc
を追加しとけばいいだけじゃないの?
0586NAME IS NULL
垢版 |
2017/10/10(火) 08:36:52.44ID:oX0yCwR9
でたらめアドバイスだらけだが、OracleのFROM句の副問い合わせは、インラインビューと呼ばれ、並び替えも含めてインラインビューの結果そのものを、再度、検索する。

rownomをSELECT句に書いて、別名を付けるのは一般的ではない。
0587583
垢版 |
2017/10/10(火) 09:25:30.70ID:???
>>584,585
ご回答ありがとうございます。
別場所で質問した際は、oracle11gで、と前置きしていましたが、回答者の方がoracle固有の疑似列と知ってらっしゃったかは分かりません…

お二人に指摘頂いてるリファレンスの解釈については、確かにそのとおりですね。
公式の見解を聞きたいですが、サポート契約が無いのが辛いorz
0588583
垢版 |
2017/10/10(火) 09:29:46.26ID:???
>>586の方もご指摘ありがとうございます。

確かに、リファレンスにもROWNUMにasで別名を付けるソースではないんですよね…
ただ、既に稼働しているシステムのソースがROWNUM別名形式でして、弄くる箇所は最小限にしたいなあ、と。
0589NAME IS NULL
垢版 |
2017/10/10(火) 09:48:36.37ID:oX0yCwR9
>>588
そもそもrownumをSELECT句に挙げる慣習はOracleにはない。

最近、SELECT句で選択していない項目は条件で使えないと思っていたベテランがいたがw
0590NAME IS NULL
垢版 |
2017/10/10(火) 12:27:45.02ID:???
何でrow_number関数使わないのか
0591NAME IS NULL
垢版 |
2017/10/10(火) 13:02:37.26ID:???
既に稼働しているシステムのソースをなるべく弄らない方針にすると
負債がどんどん貯まっていって見るのも嫌になるのでおすすめ
■ このスレッドは過去ログ倉庫に格納されています