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/
0202NAME IS NULL
垢版 |
2017/04/27(木) 20:19:31.22ID:???
バグというより、データベースに事実にない情報を含めるとか違和感が
0203NAME IS NULL
垢版 |
2017/04/27(木) 20:44:47.72ID:???
numberでもバグを産む可能性を秘めてるし
どっちのリスクをとるかだけじゃね
0204NAME IS NULL
垢版 |
2017/04/27(木) 21:33:38.32ID:???
年月のみを管理したいっていう場合に
・日付としての正当性は保証されるけど不要な日の情報を持つ
・日付としての正当性は保証されないけど不要な情報を持たない
のどちらがいいか?
って話でしょ
個人的にはデータの正当性の方を重視するかな
0205NAME IS NULL
垢版 |
2017/04/28(金) 07:06:33.42ID:???
そして2017/4/1と2017/4/2など
同一年月で複数レコードできてしまうのでした
0206NAME IS NULL
垢版 |
2017/04/28(金) 07:18:39.77ID:???
年月情報をユニーク制約を保持する仕様で日付計算のためにdate使ってたら、皆さんはどう思いますか
0207NAME IS NULL
垢版 |
2017/04/28(金) 10:47:01.79ID:???
もうUNIQUE制約のある年月列と日付計算用の列を分けろよ
0208NAME IS NULL
垢版 |
2017/04/28(金) 11:33:54.87ID:???
レコードの入力時に日付が何入っていようと、1にしてしまえば良いだけだろう
0209NAME IS NULL
垢版 |
2017/04/28(金) 12:16:53.71ID:???
そんなもん制約がなければ全く信用できん
本当に頭が悪いなお前ら
0210NAME IS NULL
垢版 |
2017/04/28(金) 13:33:21.87ID:???
>>205
2017/00 とか 2017/13 とか入ってるのとどっちがいい?
0211NAME IS NULL
垢版 |
2017/04/28(金) 15:57:28.27ID:???
DB側の制約がいかに利用されていないか分かるな
0212NAME IS NULL
垢版 |
2017/04/28(金) 18:48:18.70ID:???
1日の0時になっているか確認するcheck制約つければいい
0213NAME IS NULL
垢版 |
2017/04/28(金) 20:51:04.78ID:???
そもそもカラムが年と月別なんだからcheck制約でもMonth>=1 and Month<=12でいいから簡単だろ
プログラムも同様
まさか日付を変換して1日かとかやるとか?
いらない情報付与からして、そんなのうちでは許されないわw
0214NAME IS NULL
垢版 |
2017/04/30(日) 03:36:41.43ID:???
>>182
後の人間を苦しめるコードをまき散らすのは止めよう
0215NAME IS NULL
垢版 |
2017/04/30(日) 19:54:54.91ID:PSrTmapn
>>214
馬鹿の苦しみなんか気にしてられんわw
0216NAME IS NULL
垢版 |
2017/04/30(日) 20:56:47.54ID:???
3年分取ってきてと言われて初めて問題に気付くパターンや
0217NAME IS NULL
垢版 |
2017/04/30(日) 23:19:56.68ID:???
where fiscal_year(year, month) = 2017
みたいな感じで関数使うかビュー使うほうがロジックが一箇所に集まっていい気がする
パフォーマンス気にするレベルならcalender yearとは別にfiscal yearをデータに持たせるかな
0218NAME IS NULL
垢版 |
2017/04/30(日) 23:33:29.04ID:???
あと fiscal_year(date) みたいにオーバーロードしとけば
インターフェースが統一されて使いやすい
0219NAME IS NULL
垢版 |
2017/05/01(月) 09:41:38.57ID:???
SQLにオーバーロードあるんですか?どんなRDB?
0220NAME IS NULL
垢版 |
2017/05/01(月) 10:54:41.81ID:???
え、、、普通にあるでしょ
むしろできないDBってどれよ
0222NAME IS NULL
垢版 |
2017/05/01(月) 14:14:22.87ID:???
そうなんか、OracleとPostgreSQLで出来てるから普通なのかと・・・
0223NAME IS NULL
垢版 |
2017/05/01(月) 14:29:03.64ID:???
まーた、俺様の「普通」が炸裂しとる
0224NAME IS NULL
垢版 |
2017/05/01(月) 14:33:46.48ID:???
Oracleは特例
いいね?
0225NAME IS NULL
垢版 |
2017/05/01(月) 15:03:51.32ID:???
てか、そもそもOracleでも単純なオーバーロードってあったっけ?
0227NAME IS NULL
垢版 |
2017/05/01(月) 15:07:37.27ID:???
このケースはComputed Columnが使えればそれがいいと思うけど
Postgresでは使えないから関数オーバーロードしとくって話
Computed Columnなら使えるDB多いだろ

SQL標準ならView使えって話かもしれんがViewは管理上のオーバーヘッドが高くなる傾向があるから
使わなくてすむケースならなるべく使わないようにしてる
0230NAME IS NULL
垢版 |
2017/05/01(月) 16:10:53.74ID:???
>>228
会計年度を必要とするたびに繰り返し同じことをするのでよければね
年度別に集計したい場合とかしんどいし俺はごめんだわ
0231NAME IS NULL
垢版 |
2017/05/01(月) 16:49:59.51ID:???
普通に関数でいいと思うんだが、あえて(関数?)オーバーロードって言ってるのはなんで?
0232NAME IS NULL
垢版 |
2017/05/01(月) 16:57:59.25ID:???
>>230
そういうこと言ってるからいつまでたってもスキルが向上しないんだよ
select case when month < 4 then year - 1 else year end as fiscal_year, sum(hoge)
from foo
group by case when month < 4 then year - 1 else year end
0233NAME IS NULL
垢版 |
2017/05/01(月) 17:06:24.57ID:???
つか、いたるところで会計年度を意識するようなシステムなら、会計年度カラムを作っとけばいいよな
0234NAME IS NULL
垢版 |
2017/05/01(月) 18:03:32.59ID:???
>>232
where句も入れて何回繰り返すのさ
面倒くさいとは思わないの?
単発の作業ならわからんでもないが会計年度みたいなのは1回じゃすまないだろ

>>231
日付型でデータを持ったテーブルがあったり
日付型に徐々に移行したい場合に同じ名前で扱えるとうれしいから
会計年度って概念をDBに反映させる一つの手段
0235NAME IS NULL
垢版 |
2017/05/01(月) 18:18:52.43ID:???
>>234
> 面倒くさいとは思わないの?
いや、まったく
>>232レベルのクエリなら10秒もかからずタイプできるだろ
0236NAME IS NULL
垢版 |
2017/05/01(月) 18:28:00.19ID:???
>>234
> where句も入れて何回繰り返すのさ
ストアドでも似たようなもんだろ。
select fiscal_year(year, month), sum(hoge) from fuga group by fiscal_year(year, month)
しかもストアド使うと、year, monthにインデックスあっても使われないし。
0237NAME IS NULL
垢版 |
2017/05/01(月) 18:37:19.33ID:???
ストアド最強!!!|バカの壁| SQL92以降
0238NAME IS NULL
垢版 |
2017/05/01(月) 18:46:32.86ID:???
kantomi@qiita_banned < ストアド!ストアド!
0239NAME IS NULL
垢版 |
2017/05/01(月) 18:53:59.52ID:???
>>235
面倒くさいと思わないならいいんじゃね

>>236
asで名前つけとけばgroup byでは繰り返す必要ないよ
たとえ繰り返しが必要だったとしても概念をその名前で直接扱える状態と
毎回展開しなきゃいけない状態では全く意味が違うんだけどね

インデックスは必要ならはればいい
0240NAME IS NULL
垢版 |
2017/05/01(月) 19:03:28.63ID:???
>>233
算出できる情報を別途カラム作って持たせるのは最終手段
0241NAME IS NULL
垢版 |
2017/05/01(月) 19:04:19.13ID:???
>>180 重み付けの定石
>>182 単年度でしか動かないクソ
>>185 意図が分かりやすい
>>217 ビジネスロジックをDBMSに持たせる派とアプリに持たせる派で戦争勃発
0243NAME IS NULL
垢版 |
2017/05/01(月) 21:25:30.10ID:???
>>234
fiscal_year(year, month)って関数自体はまだなにもオーバーロードしてないだろうが。
0244NAME IS NULL
垢版 |
2017/05/01(月) 21:52:46.85ID:45FTV8QE
>>241のどこが馬鹿なのか論理的に説明できないやついるの?
0245NAME IS NULL
垢版 |
2017/05/01(月) 23:12:56.24ID:???
>>240
分解せずに日付型で持っていればよかったって事だな
以降>>188へ戻る
0246NAME IS NULL
垢版 |
2017/05/02(火) 03:16:15.56ID:???
管理上のオーバーヘッドってのがユーザ側の話なのかシステム側の話なのかしらんが
関数オーバーロードができたとして、それがビューより管理が重いとか信じられん

会計年度が必要ならそう言うビュー作れ、で終わりじゃないのか
0247NAME IS NULL
垢版 |
2017/05/02(火) 08:24:38.84ID:???
一方ロシアは会計年度カラムを追加した
0248NAME IS NULL
垢版 |
2017/05/02(火) 10:00:08.57ID:???
インデックス張るなら、ロシア方式が一番いいよな
トリガーで仕掛けておけば気にしなくて済むし
0249NAME IS NULL
垢版 |
2017/05/02(火) 10:17:39.11ID:???
>>239
> インデックスは必要ならはればいい
本末転倒だな
普通にクエリ書けばインデックス使えるのに、ストアドにしようと思うとさらに何かしないといけなくなる
つか、ストアドの結果にインデックス貼れないDBもあるんじゃね?
0250NAME IS NULL
垢版 |
2017/05/02(火) 10:22:47.67ID:???
>>239
> asで名前つけとけばgroup byでは繰り返す必要ないよ
その手段が使えるDBでは、>>232も同じことが言える

> 毎回展開しなきゃいけない状態では全く意味が違うんだけどね
例えば四半期ごとの集計がほしいとか、移動平均がほしいとかいうことになったら、
そのたびにストアド作るのか?
増殖しまくりだな
0251NAME IS NULL
垢版 |
2017/05/02(火) 10:26:43.28ID:???
ん? >>232 だとインデックス使われないだろ
>>217-218 >>185 のような関数だともっと使われない
>>182 のように or あると、うまく使ってくれるか怪しい
0252NAME IS NULL
垢版 |
2017/05/02(火) 10:38:44.85ID:???
>>251
> ん? >>232 だとインデックス使われないだろ
where書いてないからね
>>232は、集計がしんどいという奴へのレス

>>182 のように or あると、うまく使ってくれるか怪しい
大抵のRDBMSだったらうまく使ってくれるんじゃね?
0253NAME IS NULL
垢版 |
2017/05/02(火) 10:44:41.29ID:???
それより決算月が変わる可能性について考えたほうがいいと思う
0254NAME IS NULL
垢版 |
2017/05/02(火) 10:45:38.57ID:???
>>251
> >>217-218 >>185 のような関数だともっと使われない
こういうバカ避けのためにわざわざ「性能は知らん」って書いてあるのにバカはそれすら理解できないんだな w
インデックス使いたいならdate型にしとけよ
0256NAME IS NULL
垢版 |
2017/05/02(火) 10:51:13.38ID:???
>>254
year, monthにインデックス張ればいいだろ
アホか
0257NAME IS NULL
垢版 |
2017/05/02(火) 11:01:20.42ID:???
ビューのコストが高いというのがparserの話だとしたら、単純なビューなら最近では全く問題にならない
まぁ、大抵の場合、クエリ1回につき+1ms未満だろう。
(さらには、直近のparse結果をcacheしている場合もある)
0258NAME IS NULL
垢版 |
2017/05/02(火) 11:03:21.36ID:???
>>256
> year, monthにインデックス張ればいいだろ

インデックス張っても関数の引数にしちゃったら使われない
0259NAME IS NULL
垢版 |
2017/05/02(火) 15:49:34.57ID:???
>>256
バカってこれだから...
複数の列に張るより単一の方が有利だろう
そんなことも理解できないのかよ w
0260NAME IS NULL
垢版 |
2017/05/02(火) 16:00:26.84ID:???
そんな理由だったらオレもアンタをバカ呼ばわりしていいかな
0262NAME IS NULL
垢版 |
2017/05/02(火) 17:11:25.84ID:???
不利っつっても、比較が1回か2回かって違いくらいしかないだろ。
0263NAME IS NULL
垢版 |
2017/05/02(火) 17:17:06.13ID:???
ここを2つに分けるかどうかの是非はともかく
キーが2つになるから絡むつにしようとかおかしいだろw

まあこのケース、月なんて12通りしか無いんだし複合キーで
0264NAME IS NULL
垢版 |
2017/05/02(火) 18:48:29.70ID:???
>複数の列に張る

こういう言い方しているところを見ると、複合インデックスの仕組みをわかってないんだろう。
0265NAME IS NULL
垢版 |
2017/05/02(火) 18:57:10.84ID:???
yearのインデックスとmonthのインデックスを別々に張りそう
0266NAME IS NULL
垢版 |
2017/05/02(火) 19:11:26.98ID:???
>>250
>その手段が使えるDBでは、>>232も同じことが言える
そんなんわざわざ言わんでもわかっとるがな〜ww

>増殖しまくりだな
増殖して何か問題あるの?
0267NAME IS NULL
垢版 |
2017/05/02(火) 21:48:44.24ID:???
>>246
システム側の話
組織構造なんかも大きく影響するから環境による
導出列はビューを使うっていう規約があってそれに従ってるようなところならオーバーヘッドも少ないだろうね
ただ関数よりビューのほうが管理の厳格度というか管理レベルが高いのは一般的じゃないのかな?
管理レベルが高ければその分のオーバーヘッドはかかる

それに同じような年・月で持ってるテーブルが10個に増えたら10個ビューを追加することになる
そういうのが嫌だからComputed Column的な機能があるDBが多いと思ってる
0268NAME IS NULL
垢版 |
2017/05/02(火) 22:51:26.07ID:???
>>264
お前こそわかってないだろ w
>>180, >>182 みたいに複合インデックスの各々の列を別々に大小比較で使うとインデックス使えないぞ
0269NAME IS NULL
垢版 |
2017/05/02(火) 23:17:09.54ID:???
使われないインデックスと、使えないお前らの脳ミソ達。
0270NAME IS NULL
垢版 |
2017/05/03(水) 00:11:51.74ID:???
>>182は(orは別として)yearとmonthの複合インデックスの教科書的な例だと思うが。
つか、>>180>>182を同列に並べている時点でお里が知れる。
0271NAME IS NULL
垢版 |
2017/05/03(水) 04:36:48.77ID:???
>>267
管理レベルってのがなんだかわからんが
ビューの方がより厳密に適用される分、問い合わせ時のシステム的なオーバーヘッドは小さいだろ
実行計画もより最適化できる
つか、ユーザー側/システム側って切り分けが、どっちも人員の切り分けだと思ってる?

>それに同じような年・月で持ってるテーブルが10個に増えたら
同じものが分散して存在してたら、その時点でテーブル設計が間違ってるわ
0272NAME IS NULL
垢版 |
2017/05/03(水) 07:59:56.11ID:???
馬鹿はなぜ無駄に未来の心配ばかりするのか
0273NAME IS NULL
垢版 |
2017/05/03(水) 09:25:30.95ID:???
>>270
実行計画見てみ
複合インデックスの仕組み知ってたらそんなアホな発想はできないよ
0274NAME IS NULL
垢版 |
2017/05/03(水) 10:39:56.79ID:???
おまえこそ見てみろと言いたいが。

念のためだが、ヘボいオプティマイザがorのせいでスキャン範囲の限定に失敗するのは
「複合インデックスの各々の列を別々に大小比較で使うとインデックス使えない」てのとは
関係ないからな。
0275NAME IS NULL
垢版 |
2017/05/03(水) 11:04:58.97ID:???
>>274
> orのせいで
バカを晒すのはほどほどにしろよ
0277NAME IS NULL
垢版 |
2017/05/03(水) 12:40:47.23ID:???
今どきは>>182でも(year,month)のインデックスがあれば
(そしてそれを使ったほうが速いとDBMSが判断すれば)
使うDBMSのほうが多いと思う

パフォーマンスに関しては昔の定石を今はあまり気にしなくても
良くなっていることが多いので必ず実機で試してから語ったほうがいい
0278NAME IS NULL
垢版 |
2017/05/03(水) 13:06:33.96ID:???
>>276
それはyearを使わずにmonthだけだった場合だな。こんな初歩的な勘違いしてたのか。
0279NAME IS NULL
垢版 |
2017/05/03(水) 13:34:58.40ID:???
>>278
バカはこれだから...
わざわざ
> インデックスの構造をより深く見ていくと、この理由がはっきりします。
って言うところまで引用してるだからその下読めよ
理解できるかどうかは知らんけど w
0280NAME IS NULL
垢版 |
2017/05/03(水) 14:38:41.03ID:???
アホなレス量産してるやつは約1名だけっぽいな
0281NAME IS NULL
垢版 |
2017/05/03(水) 17:44:08.92ID:???
year, monthにインデックスの件だけど、PostgreSQLなら使われるけどなぁ
ほかのDBだと使われなかったりするのか?
0282NAME IS NULL
垢版 |
2017/05/03(水) 17:47:31.47ID:???
create table hoge (year integer, month integer, amount integer);
create index hoge_idx on hoge(year, month);

select year, month, sum(amount)
from hoge where (year = 2017 and month > 3) or (year = 2018 and month < 4)
group by year, month;

実行計画:
https://explain.depesz.com/s/rwx
0283NAME IS NULL
垢版 |
2017/05/03(水) 18:26:59.82ID:???
使われないDBがあると思ってるのは約1名だけだぞ
0284NAME IS NULL
垢版 |
2017/05/03(水) 18:31:37.11ID:???
実行計画見るような人なら当然わかっているだろうけど、統計情報がとられていなかったり
選択されるレコードの割合ががテーブル全体に対して大きい場合はインデックススキャンが
選択されないから注意な。
0285NAME IS NULL
垢版 |
2017/05/03(水) 18:42:36.82ID:???
インデックス使われないマン =
オーバーロードマン =
Computed Columnマン
0286NAME IS NULL
垢版 |
2017/05/03(水) 18:49:07.86ID:???
=管理レベルマン
0288NAME IS NULL
垢版 |
2017/05/03(水) 19:56:46.81ID:???
まさか今どき、インデックスがあれば必ず使うとか思ってるんだろうか
ルールベースとコストベースの違いも分かってない?
0289NAME IS NULL
垢版 |
2017/05/03(水) 20:03:06.22ID:???
「使われない場合もある」に方向転換w
0290NAME IS NULL
垢版 |
2017/05/03(水) 20:30:25.65ID:???
>>285
おいこら
インデックス使われないマンと一緒するなよw
0292NAME IS NULL
垢版 |
2017/05/03(水) 20:49:46.41ID:???
>>291
インデックス使われないマンちぃーす
0293NAME IS NULL
垢版 |
2017/05/03(水) 21:10:30.66ID:/Lg9geb/
お前らが馬鹿なのは使う必要のないインデックスについて延々と話してることだけどな
0294NAME IS NULL
垢版 |
2017/05/03(水) 22:00:09.77ID:???
>>288
「使う場合もある」に方向転換w
0295NAME IS NULL
垢版 |
2017/05/03(水) 22:14:57.26ID:???
>>282
それ >>287 が書いてる通り Bit Map Index Scanだよ
URL読めばわかると思うけど

> ビットマップスキャンは、一度に全てのタプルへのポインタをインデックスから取り出し、
----
インメモリな「ビットマップ」データ構造を使ってソートし
----
> 物理的なタプル位置の順にテーブルのタプルにアクセスします。

つまりyearとmonthに対して個別にインデックス張っときゃソートなんて要らない
要するに >>264-265 をディスってるだけなんだが w
0296NAME IS NULL
垢版 |
2017/05/03(水) 22:20:18.00ID:???
結論

>year, monthにインデックス張ればいいだろ
>アホか
0297NAME IS NULL
垢版 |
2017/05/03(水) 22:20:54.65ID:???
まあ、日付型とか言ってる奴は決算月の考慮どうするんだろうと思うわ
0298NAME IS NULL
垢版 |
2017/05/03(水) 22:51:38.44ID:???
またドヤ顔で恥の上塗り
0299NAME IS NULL
垢版 |
2017/05/03(水) 22:56:01.77ID:???
具体的に説明できない奴がわらわら沸いてるw
■ このスレッドは過去ログ倉庫に格納されています