03843832018/06/26(火) 16:58:48.22ID:??? FROM C WHERE Bid = t1.id) t3 の部分で、「t1はここから参照できない」みたいなエラーです。 03853832018/06/26(火) 17:50:23.15ID:??? 自己解決しました (SELECT B.id, COUNT(col1) AS nullでない数 FROM C GROUP BY B.id) t3 として、WHERE句を取ればいいだけでした
無駄な検索時間は増えてしまうと思いますが・・・ 0386NAME IS NULL2018/06/27(水) 01:56:23.14ID:???>>385 カラム名を変えさせてもらった tableB id, A_id tableC B_id, col
select tableA.id, tableB.id, count(C.col) as count from tableA,tableB, (select B_id, (case when col1 is NULL then NULL else 1 end) as col from tableC) as C where tableA.id=tableB.A_id and tableB.id=C.B_id and C.c is not NULL group by A_id,C.col; 0387NAME IS NULL2018/06/27(水) 02:05:38.77ID:??? 訂正 最後から2行目
× C.c is not NULL ○ C.col is not NULL 0388NAME IS NULL2018/06/27(水) 08:42:50.79ID:???>>383 BCを先にjoinしてカウント。その結果とAをjoin 0389NAME IS NULL2018/06/27(水) 11:12:53.09ID:??? お願いします。 質問文を入力すると403 Forbiddenとなるのですが、なぜでしょう? こういう文章は入力できるのに・・・ 0390NAME IS NULL2018/06/27(水) 11:16:55.56ID:??? 再度質問を投稿してみます。
の条件のところに (条件1 AND 条件2 AND ...AND 条件10) AND (条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10)) AND (条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10) AND ... AND ((NOT 条件1) AND 条件2 AND ... AND 条件10)
と愚直に11通り書く他に、スマートに書く方法無いの? 0397NAME IS NULL2018/07/14(土) 15:48:00.68ID:??? where case when 条件1 then 1 else 0 end + case when 条件2 then 1 else 0 end ... + case when 条件10 then 1 else 0 end >= 9 0398NAME IS NULL2018/07/14(土) 16:33:57.42ID:??? なるほど、CASE式を使うのか。 サンQ
ってか質問のころ、11通りを結ぶのはANDじゃなくてORの間違いだったな。 0399NAME IS NULL2018/07/16(月) 18:50:59.75ID:XzzcYhc4>>398 複数のselect文を書いてunion allの方が意図がわかりやすいうえに、条件を変えるときも変更時のリスクも低い。 0400NAME IS NULL2018/07/16(月) 19:13:40.21ID:???>>399 ちょっと具体的に書いてみ
まともな頭持ってたら書いてる途中で顔真っ赤になると思うが… 0401NAME IS NULL2018/07/16(月) 19:16:01.66ID:???>>399 条件ちゃんと読んでないのかもしれんが、複数条件つなぐのはorだぞ ちょっとunionで書いてみてくれよ 0402NAME IS NULL2018/07/16(月) 20:50:23.35ID:??? 単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが 0403NAME IS NULL2018/07/16(月) 21:32:24.07ID:???>>402 それのどこが「スマート」なんだ? 0404NAME IS NULL2018/07/16(月) 21:39:54.23ID:??? 質問者自身にしろ、CASE使った回答にしろ、 SELECT条件で9個以上の判定をしていますが、 UNION使って列挙した場合、それぞれのSELECTが 独立してテーブルをスキャンする事になるので 仮に上手く書けたとしても効率が悪いって気がします 0405NAME IS NULL2018/07/16(月) 22:51:06.23ID:5Oge9TUh>>404 それは素人の考え方です。先の例ではSQLの見た目はシンプルそうに見えますが、実際の処理コストは高いと思われます。 0406NAME IS NULL2018/07/16(月) 22:53:57.62ID:5Oge9TUh それなりにデータベースに詳しくてもいまだにSQLはこう書くと内部でこう処理されると主張する方がいますが、それはリレーショナルデータベースの根本から否定する主張です。SQLは処理方法を指定しない非構造化言語です。 0407NAME IS NULL2018/07/16(月) 23:01:38.78ID:5Oge9TUh>>404 リレーショナルデータベースはそんなにお馬鹿ではありません。SQLの発行回数を問題視したり、SELECT句が難度も出てきたり、見た目だけでコストが高い、性能が悪いと言われて仕事でもかなりの支障をきたしますのでそういった発言は控えてください。
まずは実行計画と実際にどのように処理されたかSQLをトレースして己の知識を高めてから偉そうなことを言ってください。 0408NAME IS NULL2018/07/16(月) 23:03:33.07ID:??? 後の例を提示してもらった上で性能なり効率なりを評価してみましょう 0409NAME IS NULL2018/07/16(月) 23:07:17.64ID:5Oge9TUh>>408 すぐに回答を欲しがるいつものあなたですが、ここは教育スレッドではありません。
ちなみにさきほどの非構造化とは非構造化データのことではなく、構造化定義のない言語という意味です。 0410NAME IS NULL2018/07/16(月) 23:12:29.73ID:??? 教えてもらうスレではなく、質疑応答スレです。
>402 名前:NAME IS NULL[sage] 投稿日:2018/07/16(月) 20:50:23.35 ID:??? >単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが
この人がSQL書いて提示するのを待っているところですが 0411NAME IS NULL2018/07/16(月) 23:18:34.32ID:5Oge9TUh>>397 の良くない点を挙げましょう。
SQLの入門書の絵でも見て勉強してください。 0417NAME IS NULL2018/07/16(月) 23:45:50.92ID:??? この人NGにした方が良さそうですね? 0418NAME IS NULL2018/07/16(月) 23:52:58.66ID:5Oge9TUh UNION ALLでなくてもSELECTがひとつでないといけないルールがあるなら、WHERE句に10個の条件がすべて真、9個の条件がすべて真の条件をOR条件でつないでもかまいません。 0419NAME IS NULL2018/07/16(月) 23:58:36.32ID:5Oge9TUh 条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。
select * from table1 where 条件;
の条件のところに (条件1 AND 条件2 AND ...AND 条件10) AND (条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10)) AND (条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10) AND ... AND ((NOT 条件1) AND 条件2 AND ... AND 条件10)
と愚直に11通り書く他に、スマートに書く方法無いの?
↑は本人も訂正していますがORの間違いでANDと書いています。さらに本人は気づいていなかったようですが「 NOT 条件 」部分はいりません。
質問者はスマートではないと言っていますが、本人がスマートではないと見た目だけで思っているだけで、まったく悪くはありません。 0420NAME IS NULL2018/07/17(火) 05:22:06.92ID:???>>413 おれなら11個も同一テーブルからのunion allとか書いてたらアホかと思うけどな whereで11個or条件書く方がマシだわ どっちにしても、9個以上が8個以上とか7個以上とかになったらどうするんだろうね
ああ、たんに最近union覚えて使いたいだけか
理解できてないのはお前のunionに対する実行効率だよ
まあ>>397がループのネストとか俺には意味不明だから、俺を遙かに超越した理解の持ち主なのかもしれんが 0421NAME IS NULL2018/07/17(火) 06:35:01.38ID:??? 環境はそれぞれだったら、いろんな方法を試したらいいんじゃない? で、目的に一番合うもの選べば。 0422NAME IS NULL2018/07/17(火) 07:11:11.28ID:??? 効率云々の前にunion allとかにしたら重複行の扱いで結果異なるし >>417が正解かと 0423NAME IS NULL2018/07/17(火) 11:41:13.48ID:??? まあちゃんとnot条件書けばいちおうunionでもunion allでも同じになるんじゃね unknownになるような条件書かなきゃな 0424NAME IS NULL2018/07/17(火) 19:05:25.28ID:??? >403 どっちがスマートかと言えば、unionで繋げた方が"sql文"としてはスマートかな 0425NAME IS NULL2018/07/17(火) 20:31:21.01ID:??? 現実社会じゃクイズ解いてるわけじゃないんだから、アプリ側でやっちゃうだけ 0426NAME IS NULL2018/07/17(火) 20:40:16.91ID:???>>425 この例で アプリ側でどんなクエリ発行してどんなロジックでチェックするのか教えてくれ 0427NAME IS NULL2018/07/17(火) 21:16:08.13ID:???>>424 だからSQL書いてみろって 書いてる間に顔真っ赤になるだろ w 0428NAME IS NULL2018/07/17(火) 21:20:42.11ID:??? お前は読めるのか? 0429NAME IS NULL2018/07/17(火) 22:10:19.21ID:??? unionおじさんの次の一手は誰も言ってない要件を持ち出す、かな 0430NAME IS NULL2018/07/17(火) 22:47:07.54ID:adSOPTjX UNIONとUNION ALLはまったく別物だ。 0431NAME IS NULL2018/07/17(火) 22:50:39.33ID:adSOPTjX>>422 だから質問者のWHERE句での条件でいいのに。 なんでSQLを直すことになったらすぐにWHERE句全体が崩壊する方法を勧めるひとがいるの? 0432NAME IS NULL2018/07/17(火) 22:57:06.79ID:adSOPTjX>>422 確かにUNION ALLでは同じレコードが返ってくることには気づかなかった。 0433NAME IS NULL2018/07/17(火) 23:05:43.48ID:adSOPTjX 質問者が静的SQLにこだわっている理由も気になる。10個の条件のうち9個が真という条件が激しく変化するのなら、動的SQLでSELECT文を組み立てた方が、てっとり早い。
こういう条件の場合は動的にSQLを組み立てるのが普通で、静的SQLにこだわる理由がみつからない。
こういう検索機能を動的SQLではなく、静的SQLにしようとすると、例の仕様変更に耐えられないSQLを使用しなくてはいけないなる。 0434NAME IS NULL2018/07/17(火) 23:26:06.21ID:???>>433 静的/動的は関係ないでしょ? まあ動的に生成するなら>>396でもそんなに面倒じゃないけど>>397でなんの問題もないしな ちな>>399は論外 0435NAME IS NULL2018/07/17(火) 23:31:51.56ID:??? 素朴な疑問だけど、なぜみんなUNIONを嫌うの? 0436NAME IS NULL2018/07/18(水) 00:03:15.34ID:??? 適切な使い方なら良いんだが、これは違うだろう 0437NAME IS NULL2018/07/18(水) 02:54:15.10ID:??? この例で最悪でもテーブルスキャン1回で済ます実行計画吐くならまあunion allでもいいんじゃね 結果行数が多くなるならunionはダメだろうけど 0438NAME IS NULL2018/07/18(水) 08:36:07.89ID:??? 誰か最初のUNION(ALL)の手前までででいいからSQL書いてくれ 0439NAME IS NULL2018/07/18(水) 12:04:56.31ID:??? 言うに事欠いて1回のスキャンで済むunionとか… 0440NAME IS NULL2018/07/19(木) 15:29:12.57ID:ql5n9nVD 【3.11津波は自民由来!? 安倍逮捕秒読みか!?】 ロシア国防省『日本は地震を偽装した核実験を止めよ』 http://rosie.5ch.net/test/read.cgi/liveplus/1531966541/l50
2018年、テレビが隠している大ニュース! 0441NAME IS NULL2018/07/20(金) 00:47:16.08ID:qGWP8ju3 ここのキチガイは実行計画もみたことがないからな。文字数が少ないSQLがスマートと言い張る。 なんでプログラマなのに 0442NAME IS NULL2018/07/20(金) 12:58:13.55ID:??? a 0443NAME IS NULL2018/07/20(金) 21:39:10.73ID:??? 実行計画という用語を最近覚えたノロマ w 0444NAME IS NULL2018/07/20(金) 23:08:59.22ID:GJRr/f3G おまえの事やんけ 0445NAME IS NULL2018/07/20(金) 23:40:11.94ID:??? なにか気に触ったのか? w 0446NAME IS NULL2018/07/21(土) 07:43:39.15ID:5x2HyI6i おまえ何時も他人の顔色うかがってばかりやな 0447NAME IS NULL2018/07/21(土) 08:27:53.48ID:??? ノロマは何をやっても駄目だな w 0448NAME IS NULL2018/07/21(土) 12:27:57.38ID:5x2HyI6i おまえの事やんけ 0449NAME IS NULL2018/07/21(土) 13:27:35.31ID:??? 実行計画とか考慮したら、unionはないわw 0450NAME IS NULL2018/07/21(土) 15:38:38.03ID:???>>448 >>444 いつものバカループ w 0451NAME IS NULL2018/07/21(土) 18:42:01.35ID:OaX/dGdR>>449 実行計画がなんなのか分かってますか?
多少の知ったかぶりはかまいませんが、少しは謙虚にわからないことはわからないと言うようにしましょう。 0452NAME IS NULL2018/07/21(土) 18:46:09.10ID:??? その実行計画をやってみたいから、早くUnion使ったSQLをここに晒してくれ 0453NAME IS NULL2018/07/21(土) 18:48:49.51ID:??? unionの1回目のselectで、キャッシュに乗る 0454NAME IS NULL2018/07/21(土) 18:50:04.62ID:??? それぞれのselectが異なるのに? 0455NAME IS NULL2018/07/21(土) 18:55:37.55ID:??? バッファキャッシュ 0456NAME IS NULL2018/07/21(土) 19:22:15.63ID:??? キャッシュに乗るかどうかは実行計画とは直接は無関係だがな キャッシュにのったからって不要なテーブルスキャンが許容できるわけではない 0457NAME IS NULL2018/07/21(土) 20:00:11.00ID:??? でっかいテーブルだとキャッシュに収まるのは無理 0458NAME IS NULL2018/07/21(土) 20:17:41.08ID:??? 条件によってはインデックスしかアクセスしない可能性もあるしな 0459NAME IS NULL2018/07/21(土) 21:13:40.08ID:??? 不要なテーブルスキャン 0460NAME IS NULL2018/07/21(土) 21:14:00.83ID:HTGK0eq2>>451はアホやけどおまえらはその足下にも及ばんアホなんやで? 知らんかったやろ? 0461NAME IS NULL2018/07/22(日) 02:39:53.39ID:ODcS1lTE>>460 実行計画ではなくコストだったと間違いを認めなさい。 0462NAME IS NULL2018/07/22(日) 11:27:50.93ID:zTS56Hn0>>461 おまえが一番アホやなw 0463NAME IS NULL2018/07/22(日) 19:38:32.24ID:??? 条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。
どうせならインデックスの有無も 0466NAME IS NULL2018/07/22(日) 20:43:15.80ID:??? case whenはそのままid順になるけど、unionはならなかった union all使えば重複の除外が発生するし、変わらないんじゃない? index付けてもunion内のsql実行に影響するだけで、 マージする性能には多分影響しない
続きは各自で 0467NAME IS NULL2018/07/22(日) 21:05:02.26ID:???>>466 ただのunion はdistinctで重複除去、除去しないのがall指定 この例でunion allだと重複行がでるはずだぞ
indexは、unionの各whereには効くだろうけど、caseにはうまく効かないんじゃないかと まあそれで実行性能がひっくり返るとしても、unionで書こうとは思わんが 0468NAME IS NULL2018/07/22(日) 22:25:29.43ID:???>>464 ごめん9は間違いで8以上だったSQL直してくれる? 0469NAME IS NULL2018/07/23(月) 07:46:29.52ID:??? sql自体でなくて申し訳ないが,前の例で、10億レコードで,テーブルが列ストアで保持されているとした場合、whereでー発フィルタリングするのと、unionするのとどっちが効率的なのだろう? 条件が適用されるカラムのメンバー数にもよりそうな気もするが、どんなもんなんでしょうか 0470NAME IS NULL2018/07/24(火) 19:21:58.65ID:yAzT+3qO やってみればいいのに。見た目がシンプルなのと処理の重さは反比例する。 0471NAME IS NULL2018/07/24(火) 21:25:13.19ID:??? 見た目で決まるほど今のオプティマイザはアホじゃないし 0472NAME IS NULL2018/07/27(金) 12:11:49.90ID:??? 質問です。
select a + b +c -d as 計算結果 where 計算結果 > 0
とすると行が表示されません。where句を外すと、 計算結果は0より大きい値でちゃんと出てきます。
where a + b +c -d > 0
と書き換えると表示されたのですが、 where句でselectの as 別名 は使えないのでしょうか? 0473NAME IS NULL2018/07/27(金) 13:33:09.67ID:??? 一部つかえるDBMSもあるようだが原則使えない 0474NAME IS NULL2018/07/27(金) 18:03:08.40ID:??? 普通はselect句でつけた別名を使えるのはorder by句だけだな 04754722018/07/27(金) 18:21:36.74ID:??? そうだったんですね できそうなイメージだったんですが ありがとうございます 0476NAME IS NULL2018/07/27(金) 22:18:42.27ID:??? いい加減使えるようにしろよとは思う 0477NAME IS NULL2018/07/27(金) 22:54:00.11ID:??? select a + b +c -d as 計算結果 having 計算結果 > 0 0478NAME IS NULL2018/07/28(土) 13:12:09.25ID:tm98Iqt0>>475 よく考えてくれ。WHERE句が先に評価され、そのあとにSELECT句の選択リクトが評価される。
いったんSELECTした結果に対して、絞り込みのWHERE句つきSELECTを再度するのを基本としてしまうと、SELECT文は常にフルテーブルスキャンをして、その結果を一時的に保管して、保管した結果に対してさらに検索することになる。 0479NAME IS NULL2018/07/28(土) 13:13:33.29ID:tm98Iqt0>>471 だから見た目をシンプルにするのは意味がないと言っているのだが? 0480NAME IS NULL2018/07/28(土) 13:36:47.39ID:???>>478 なんでそんな難しいことを考えるんだよ… > select a + b +c -d as 計算結果 > where 計算結果 > 0 ってあったら select a + b +c - d as 計算結果 where a + b +c - d > 0 って展開すれば良いだけだろ 0481NAME IS NULL2018/07/28(土) 14:05:45.09ID:???>>479 >見た目がシンプルなのと処理の重さは反比例する 反比例ってどういうことだ? 基本的にはシンプルなSQLほどオプティマイザの裁量が広がって有利なんだが 0482NAME IS NULL2018/07/28(土) 15:08:24.77ID:???>>478 この場合はどっちにしても全行計算してから絞り込むから大差ないような・・・ 0483NAME IS NULL2018/07/28(土) 15:12:20.21ID:???>>478 ああ一時テーブルのメモリと、捜査が2度手間になるのか whereが先だったのか どっかのサイトにselect結果をwhereで絞り込むって書いてたけど