よろしくお願いいたします。 0379NAME IS NULL2018/06/24(日) 21:18:41.09ID:??? select 個人名, max(case カラム番号 when 1 then エラー end) as エラー1回目, max(case カラム番号 when 2 then エラー end) as エラー2回目, max(case カラム番号 when 3 then エラー end) as エラー3回目, max(case カラム番号 when 4 then エラー end) as エラー4回目, max(case カラム番号 when 5 then エラー end) as エラー5回目 from ( select 個人名, case when not エラーA is null then 'エラーA' when not エラーB is null then 'エラーB' when not エラーC is null then 'エラーC' end as エラー row_number() over ( partition by 個人名 order by 日付 asc, オーダ番号 asc) as カラム番号 from エラー履歴 ) group by 個人名 0380NAME IS NULL2018/06/25(月) 19:53:25.00ID:??? よろしくお願いします。 0381NAME IS NULL2018/06/25(月) 21:07:08.21ID:??? こちらこそよろしくお願いします。 0382NAME IS NULL2018/06/25(月) 22:01:22.79ID:???>>379 ありがとうございます!できました!!! どうしてこんなクエリが思いつくんですか。すげぇですね! 0383NAME IS NULL2018/06/26(火) 16:30:55.58ID:??? 質問です。 tableA id
Bの1レコードにたいして、Aの情報と、Cのcol1がnullでない数の情報が欲しいのですが、 LEFT OUTER JOINでどう書けばいいでしょうか?
SELECT t1.x, t2.x, t3.nullでない数 FROM B t1 LEFT OUTER JOIN A t2 ON t1.A.id = t2.id LEFT OUTER JOIN (SELECT COUNT(col1) AS nullでない数 FROM C WHERE Bid = t1.id) t3 ON t3.B.id = t1.id
みたいな事がやりたいのですが、クエリはエラーになってしまいます。 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実行に影響するだけで、 マージする性能には多分影響しない