X



トップページDB@2ch掲示板
1002コメント319KB
SQL質疑応答スレ 18問目
■ このスレッドは過去ログ倉庫に格納されています
0001NAME IS NULL
垢版 |
2018/01/04(木) 22:12:22.14ID:???
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。

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

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

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

前スレ:
SQL質疑応答スレ 17問目
https://mevius.5ch.net/test/read.cgi/db/1468157341/
0333NAME IS NULL
垢版 |
2018/05/17(木) 22:05:10.46ID:???
START、STOPは必ず1レコードあり、複数はない
って事なら、簡単なSQLで処理できそう
0334NAME IS NULL
垢版 |
2018/05/17(木) 22:12:42.54ID:???
>>332
STARTとSTOPは複数あります。
NO順です。
NOは連番です。
STARTが1である行とSTOPが1である行は必ず交互に来て、
STARTとSTOPが同時に来ることはありません。
STARTが1の行とSTOPが1の行は続くことがあります。
STOPが1の行の直後にSTARTが1の行が来る場合もあります。
STARTが1の行の数とSTOPが1の行の数は同じです。
NO順に先頭から見ていくと、STARTが1の行は、STOPが1の行より先に出現します。

よろしくお願いします。
0335NAME IS NULL
垢版 |
2018/05/17(木) 22:21:17.05ID:???
>>334 で何をやりたいかはだいたいわかったけど
(たぶん STARTしてからSTOPするまで KEKKAを1にすればよいはず)
行順を保持しつつ状態遷移させるのって普通のSQLでできるのだろうか?
0336NAME IS NULL
垢版 |
2018/05/17(木) 22:27:50.57ID:???
START、START、STOP、STOPって並びになったときはどうすんの?
0337NAME IS NULL
垢版 |
2018/05/17(木) 22:28:51.14ID:???
334見てなかった、すまん
0338NAME IS NULL
垢版 |
2018/05/17(木) 22:51:31.55ID:???
>>334
スタートがあったら1加算ストップがあったら1減算する累積計算すればいいじゃねえ
select no sum( start + end * -1) as kekka from t as m
left join t as s
on t.no<=m.no
group by no
0339NAME IS NULL
垢版 |
2018/05/18(金) 01:30:58.99ID:???
>>338
いろいろ細かいミスは置いといて、それSTOPの行が1にならんだろ

>>329
select NO,START,STOP,
(select isnull(sum(START),0) from t where t.NO <= m.NO)-
(select isnull(sum(STOP),0) from t where t.NO < m.NO) KEKKA
from t m
とかで出来んじゃね
0340NAME IS NULL
垢版 |
2018/05/18(金) 10:08:58.76ID:???
ありがとうございます。
皆さんに教えていただいた方法を試していますが、うまく行きそうです。
ありがとうございました。
0341NAME IS NULL
垢版 |
2018/05/18(金) 17:13:55.57ID:???
・DBMS名とバージョン
10.1.16-MariaDB

・テーブルデータ
テーブル:categories
cateid  catename   
----------------
1     c1
2     c2
3     c3
4     c4
5     c5
6     c6
7     c7
8     c8

テーブル:books
cateid  bookname price
--------------------
1     b11     20
1     b12     10
1     b13     30
1     b14     40
1     b15     5
2     b21     20
2     b22     10
2     b23     30
2     b24     40
2     b25     5


・欲しい結果
cateid   catename bookname price
--------------------------------
1     c1      b14     40
1     c1      b13     30
1     c1      b11     20
2     c2      b24     40
2     c2      b23     30
2     c2      b21     20

・説明
categoriesとbooksをcateidで結合。結合の順番はbooksのpriceの降順とし、更にその結合する数の上限を3としたいのですが、どういうSQLになりますか?

ちなみに↓のようなSQLを思いつきましたが上手く行かず・・・
SELECT *
FROM categories
    LEFT JOIN (SELECT * FROM books ORDER BY price DESC LIMIT 3) books
    ON (books.cateid = categories.cateid)
priceでのソートはできてるんですが、LIMITが期待通りには機能しませんでした
まあそれもそのはず・・・これではbooksテーブル全件の上位3件を拾ってこいというクエリですからね
0342NAME IS NULL
垢版 |
2018/05/18(金) 21:21:55.34ID:???
select
 t1.cateid, catename, t1.bookname, t1.price
from books t1
join category c on c.cateid=t1.cateid
where 3 >= (
 select count(*)
 from books t2
 where
  t1.cateid = t2.cateid and
  t1.price <= t2.price
)
order by cateid, price desc;
0343NAME IS NULL
垢版 |
2018/05/20(日) 02:31:03.55ID:???
>>342
できました!ありがとうございます!
0344NAME IS NULL
垢版 |
2018/05/29(火) 11:29:58.81ID:???
table data_pool
code bb_date   baibai  suuryou
111  2018/04/01   3  2000
111  2018/04/03   1  1000
222  2018/04/05   3  1000
222  2018/04/09   3  2000
333  2018/05/01   3  5000

(PK code + bb_date)
baibai 1 売り 3 買い
月単位で集計するときにbaiba=1はマイナスとして集計し
111  2018/04  1000
222  2018/04  2000
333  2018/05  5000
のような結果を得たいのですがどう書けばいい?(mysql)
0345344
垢版 |
2018/05/29(火) 11:31:34.61ID:???
間違い
222  2018/04  3000
です
0346NAME IS NULL
垢版 |
2018/05/29(火) 12:22:53.17ID:x6Mfbf1/
こういう時に間違える人って
0347NAME IS NULL
垢版 |
2018/05/29(火) 12:41:29.95ID:???
おっちょこちょいなんだろうな
> baiba=1
とか書いてるし w
でも、欲しい結果をちゃんと書いてるのはいいことだと思う

MySQLはよく知らんけど
select
code,
date_format(bb_date, '%Y/%d'),
sum(
case baibai
when 1 then -suuryou
when 3 then suuryou
end
)
from data_pool
group by code, date_format(bb_date, '%Y/%d')
とかで行けるんじゃね?
0348NAME IS NULL
垢版 |
2018/05/29(火) 14:04:09.72ID:???
date_format の所、%Y/%m だな。
2カ所直せば大丈夫だろう
0349344
垢版 |
2018/05/29(火) 14:07:06.19ID:???
重ね重ねの間違いお恥ずかしいw
有難うございます
%d を %m にして欲しい結果を得ることが出来ました。感謝
0350NAME IS NULL
垢版 |
2018/05/31(木) 20:59:32.14ID:???
毎日の果物の価格を記録するデータベースを作りたいんですがどういうテーブルをつくったらいいですか?とりあえずitemsテーブルに果物の種類とidのカラムを作ります。
毎日の価格はどういうテーブルにしたらいいですか?
0354NAME IS NULL
垢版 |
2018/05/31(木) 21:21:57.55ID:???
被ってしまった、すまん
0355NAME IS NULL
垢版 |
2018/05/31(木) 21:27:38.54ID:???
>>354
ありがとうございますそっちで聞いてみます、
0356NAME IS NULL
垢版 |
2018/05/31(木) 22:01:13.46ID:???
まあどっちの住人もたいして変わらんからここでも良いとは思うけど
> 毎日の果物の価格を記録するデータベースを作りたいんです
とか意味がわからん
そのデータベースでどう言うことをしたいいのか、とかどういう結果が欲しいのかを書けよ...
0357NAME IS NULL
垢版 |
2018/05/31(木) 22:14:37.43ID:trgN2RKZ
またバカがごねとるw
0358NAME IS NULL
垢版 |
2018/06/01(金) 05:31:44.28ID:VfzZdde5
クリエ通知ってどうやるの?
0359NAME IS NULL
垢版 |
2018/06/06(水) 21:29:03.80ID:???
relatedなカラムにむこうのテーブルにないものをinsertすると勝手に登録してくれますか?
0360NAME IS NULL
垢版 |
2018/06/07(木) 14:54:12.56ID:???
しばらく考えてしまったが
やはり意味が分からなかった
誰か解説頼む
0361NAME IS NULL
垢版 |
2018/06/07(木) 15:10:39.40ID:???
リレーションで外部キーに存在しないものを挿入したら
どうにかしてくれるのかってことだべ
制約にならんと思うんだが、、、トリガで自分で追加するようにすればいけるかもね
0362NAME IS NULL
垢版 |
2018/06/08(金) 03:47:57.75ID:Ywf/F+oU
皆さんがアンケートの答えを格納するテーブルを作るとしたら
未回答は、nullを想定しますか?0を想定しますか?
理由も教えてください!
0364NAME IS NULL
垢版 |
2018/06/10(日) 09:42:21.89ID:???
>>361
on insert cascade か。他のカラムはどうすんだろ
0365NAME IS NULL
垢版 |
2018/06/10(日) 10:20:33.83ID:???
null なり default 値なりにするんだろ
0366NAME IS NULL
垢版 |
2018/06/10(日) 20:58:20.60ID:???
主キーはどうするんだ
0367NAME IS NULL
垢版 |
2018/06/10(日) 21:58:41.22ID:???
>>366
identity とかでいいだろ
てか insert と同じだろ
0368NAME IS NULL
垢版 |
2018/06/14(木) 13:13:32.45ID:???
自動採番のあるテーブルにインサートした場合、その番号を知るには別途selectするものですか?
0369NAME IS NULL
垢版 |
2018/06/14(木) 16:10:12.12ID:???
そもそも自動採番ってSQL標準じゃない気がするし
DBMSによるんじゃね
0370NAME IS NULL
垢版 |
2018/06/14(木) 18:37:24.82ID:???
>>368
普通は採番された番号を取得する機能が提供されてる
でないと単純なログみたいにその番号以外の部分には重複を許す列しかないと検索しようがないから
0371NAME IS NULL
垢版 |
2018/06/15(金) 10:36:36.02ID:???
>>368 です。
自分の使うデータベースで探したらありました。
自動採番ってあるの普通だと思ってたので勉強になりました。
0372NAME IS NULL
垢版 |
2018/06/17(日) 00:34:30.36ID:DF4YrmFv
こういう常時、一人しか使っていないと思っているひとは、なんなんだろうな。
0373NAME IS NULL
垢版 |
2018/06/17(日) 00:58:11.39ID:YrBEhWbQ
こういう常時、で読点打つキチガイはバカなんだろ、うな。
0374NAME IS NULL
垢版 |
2018/06/17(日) 11:52:51.97ID:???
バカだからイミフなんですね
0375NAME IS NULL
垢版 |
2018/06/19(火) 19:16:06.54ID:???
n+1問題ってなんやねん

パフォーマンス低下したら何がいけないの?
0376NAME IS NULL
垢版 |
2018/06/19(火) 19:17:03.49ID:???
何回もデータ分だけ引くの何がいけないの?
ハードが優秀なら別にいいんじゃないないの?
0377NAME IS NULL
垢版 |
2018/06/19(火) 23:22:26.54ID:NrZ3i0Js
それでええんやで
0378NAME IS NULL
垢版 |
2018/06/24(日) 19:08:35.72ID:???
助けてください。自分の力量だと解決できず

データ
日付,オーダ番号,個人名.エラーA,エラーB,エラーC
0601,00001,タナカ,エラーA発生,,
0601,00002,イトウ,,エラーB発生,
0601,00003,サトウ,,,エラーC発生
0602,00004,タナカ,エラーA発生,,
0602,00005,イトウ,エラーA発生,,
0602,00006,スズキ,エラーA発生,,

このとき、個人別にエラー回数の内訳を出したいのです。
個人名, エラー1回目, エラー2回目, エラー3回目,…
タナカ,エラーA,エラーA,,
イトウ,エラーB,エラーA,,
サトウ,エラーC,,
スズキ,エラーA,,

使用DBはMYSQLですがストアドは使えないという制約があり
エラー回数は動的に延ばせればという要望がありますが、5回で止めてもOKです。

よろしくお願いいたします。
0379NAME IS NULL
垢版 |
2018/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 NULL
垢版 |
2018/06/25(月) 19:53:25.00ID:???
よろしくお願いします。
0381NAME IS NULL
垢版 |
2018/06/25(月) 21:07:08.21ID:???
こちらこそよろしくお願いします。
0382NAME IS NULL
垢版 |
2018/06/25(月) 22:01:22.79ID:???
>>379
ありがとうございます!できました!!!
どうしてこんなクエリが思いつくんですか。すげぇですね!
0383NAME IS NULL
垢版 |
2018/06/26(火) 16:30:55.58ID:???
質問です。
tableA
id

tableB
id, A.id

tableC
B.id, col1

のような、A-B-Cと、親-子-孫の関係で、子孫になるほど関連する行が1対多数になっていくテーブルで、

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

みたいな事がやりたいのですが、クエリはエラーになってしまいます。
0384383
垢版 |
2018/06/26(火) 16:58:48.22ID:???
FROM C WHERE Bid = t1.id) t3
の部分で、「t1はここから参照できない」みたいなエラーです。
0385383
垢版 |
2018/06/26(火) 17:50:23.15ID:???
自己解決しました
(SELECT B.id, COUNT(col1) AS nullでない数 FROM C GROUP BY B.id) t3
として、WHERE句を取ればいいだけでした

無駄な検索時間は増えてしまうと思いますが・・・
0386NAME IS NULL
垢版 |
2018/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 NULL
垢版 |
2018/06/27(水) 02:05:38.77ID:???
訂正 最後から2行目

× C.c is not NULL
○ C.col is not NULL
0388NAME IS NULL
垢版 |
2018/06/27(水) 08:42:50.79ID:???
>>383
BCを先にjoinしてカウント。その結果とAをjoin
0389NAME IS NULL
垢版 |
2018/06/27(水) 11:12:53.09ID:???
お願いします。
質問文を入力すると403 Forbiddenとなるのですが、なぜでしょう?
こういう文章は入力できるのに・・・
0390NAME IS NULL
垢版 |
2018/06/27(水) 11:16:55.56ID:???
再度質問を投稿してみます。

CREATE TABLE TB(
MM VARCHAR(81) DEFAULT ’NOTHING’ NOT NULL)

なのですが、DEFAULTで'NOTHING'が設定されていてNULLにならないと思うのですが
文末にNOT NULL制御を掛けているのはなぜなのでしょうか?
0391NAME IS NULL
垢版 |
2018/06/27(水) 12:49:39.15ID:???
>>390
> NULLにならないと思うのですが
NULLは後からでも設定できるだろ
0392NAME IS NULL
垢版 |
2018/06/28(木) 05:17:45.28ID:???
>>390
insertでカラムにnull指定すれば出来るからでは
0393NAME IS NULL
垢版 |
2018/06/28(木) 09:25:57.73ID:???
>>391
>>392
ありがとうございました!言われると恥ずかしいくらい簡単なことだったのですね。先生方、ありがとうございました。
0394NAME IS NULL
垢版 |
2018/07/02(月) 08:04:38.26ID:NPOvlBFE
1時間に1回だけ引けるガチャを実装したいんだけどどうすればいいですか?
一応、ユーザがいつガチャを引いたかを記録するテーブルを作って(不正が分かるように必須)
そこから検索かけて該当するのがあれば残り時間を返すみたいな実装を考えてます

・MariaDB 10
・user_id, time
・残り時間(引ける時はいらない)
0396NAME IS NULL
垢版 |
2018/07/14(土) 15:21:18.46ID:wB+JUIy4
条件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通り書く他に、スマートに書く方法無いの?
0397NAME IS NULL
垢版 |
2018/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 NULL
垢版 |
2018/07/14(土) 16:33:57.42ID:???
なるほど、CASE式を使うのか。 サンQ

ってか質問のころ、11通りを結ぶのはANDじゃなくてORの間違いだったな。
0399NAME IS NULL
垢版 |
2018/07/16(月) 18:50:59.75ID:XzzcYhc4
>>398
複数のselect文を書いてunion allの方が意図がわかりやすいうえに、条件を変えるときも変更時のリスクも低い。
0400NAME IS NULL
垢版 |
2018/07/16(月) 19:13:40.21ID:???
>>399
ちょっと具体的に書いてみ

まともな頭持ってたら書いてる途中で顔真っ赤になると思うが…
0401NAME IS NULL
垢版 |
2018/07/16(月) 19:16:01.66ID:???
>>399
条件ちゃんと読んでないのかもしれんが、複数条件つなぐのはorだぞ
ちょっとunionで書いてみてくれよ
0402NAME IS NULL
垢版 |
2018/07/16(月) 20:50:23.35ID:???
単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが
0403NAME IS NULL
垢版 |
2018/07/16(月) 21:32:24.07ID:???
>>402
それのどこが「スマート」なんだ?
0404NAME IS NULL
垢版 |
2018/07/16(月) 21:39:54.23ID:???
質問者自身にしろ、CASE使った回答にしろ、
SELECT条件で9個以上の判定をしていますが、
UNION使って列挙した場合、それぞれのSELECTが
独立してテーブルをスキャンする事になるので
仮に上手く書けたとしても効率が悪いって気がします
0405NAME IS NULL
垢版 |
2018/07/16(月) 22:51:06.23ID:5Oge9TUh
>>404
それは素人の考え方です。先の例ではSQLの見た目はシンプルそうに見えますが、実際の処理コストは高いと思われます。
0406NAME IS NULL
垢版 |
2018/07/16(月) 22:53:57.62ID:5Oge9TUh
それなりにデータベースに詳しくてもいまだにSQLはこう書くと内部でこう処理されると主張する方がいますが、それはリレーショナルデータベースの根本から否定する主張です。SQLは処理方法を指定しない非構造化言語です。
0407NAME IS NULL
垢版 |
2018/07/16(月) 23:01:38.78ID:5Oge9TUh
>>404
リレーショナルデータベースはそんなにお馬鹿ではありません。SQLの発行回数を問題視したり、SELECT句が難度も出てきたり、見た目だけでコストが高い、性能が悪いと言われて仕事でもかなりの支障をきたしますのでそういった発言は控えてください。

まずは実行計画と実際にどのように処理されたかSQLをトレースして己の知識を高めてから偉そうなことを言ってください。
0408NAME IS NULL
垢版 |
2018/07/16(月) 23:03:33.07ID:???
後の例を提示してもらった上で性能なり効率なりを評価してみましょう
0409NAME IS NULL
垢版 |
2018/07/16(月) 23:07:17.64ID:5Oge9TUh
>>408
すぐに回答を欲しがるいつものあなたですが、ここは教育スレッドではありません。

ちなみにさきほどの非構造化とは非構造化データのことではなく、構造化定義のない言語という意味です。
0410NAME IS NULL
垢版 |
2018/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 NULL
垢版 |
2018/07/16(月) 23:18:34.32ID:5Oge9TUh
>>397 の良くない点を挙げましょう。

SELECTが一度しか出てきませんが、WHERE句の条件を見れば、普通のプログラマはループのネストとわかるはずです。

一番の問題はそこではなく、仕様の変更に弱く保守性が低いところです。

複数のSELECT文のUNION ALLは結果セットを最後に単純に繋ぐだけで、それぞれのSELECT文が独立していますので仕様の変更が全体に影響しません。

ただし本当のところはオプティマイザの判断ですので、必ずこうなるわけではありません。
0412NAME IS NULL
垢版 |
2018/07/16(月) 23:27:47.58ID:???
評価は後の例が出てきてからで良いでしょう?
0413NAME IS NULL
垢版 |
2018/07/16(月) 23:29:52.01ID:5Oge9TUh
>>410
条件が10個もあり、そのうちの9個の条件が真の場合のSELECT文のパターンは膨大だと思うでしょう。

SELCT * FROM Aテーブル WHERE 条件パターン1
UNION ALL
SELCT * FROM Aテーブル WHERE 条件パターン2
UNION ALL




とかなり並べないといけないと思うと思います。

ただ冷静に考えてください。10個条件があり、すべての条件を満たすSELECTはひとつです。10個の条件のうち9個を満たすSELECT文は10個、10種類です。

たった11パターンのSELECT文のUNION ALLです。簡単でしたね。
0414NAME IS NULL
垢版 |
2018/07/16(月) 23:38:47.97ID:5Oge9TUh
このスレでは集合演算子がないことにしている回答ばかりです。おそらく集合演算子が使いこなせないのでしょう。

もっとシンプルに考えてください。プログラマとは思えません。

SQLを組み立てるときに頭の中でWHERE句内でどうにかしなければいけないと思い込んでいませんか?

常にSELECT文がひとつでSELECT句内でSELECT文を使う回答やWHERE句の服問い合わせでどうにかしようとする回答も多いですね。

特定の人物が回答しているのがよくわかります。その場しのぎの小手先のSQLほど迷惑なものはありません。
0415NAME IS NULL
垢版 |
2018/07/16(月) 23:38:56.00ID:???
条件パターンを例に従って具体的に書いてみてくれませんか?
そうすれば実際に性能評価ができそうですし
0416NAME IS NULL
垢版 |
2018/07/16(月) 23:43:50.42ID:5Oge9TUh
>>415
なぜ11種類の条件違いのWHERE句違いのSELECT文が理解できないのですか?

SELECTの結果を足し算、くっつければすればいい話ですので、あなたがUNION ALLを理解できないだけです。

SQLの入門書の絵でも見て勉強してください。
0417NAME IS NULL
垢版 |
2018/07/16(月) 23:45:50.92ID:???
この人NGにした方が良さそうですね?
0418NAME IS NULL
垢版 |
2018/07/16(月) 23:52:58.66ID:5Oge9TUh
UNION ALLでなくてもSELECTがひとつでないといけないルールがあるなら、WHERE句に10個の条件がすべて真、9個の条件がすべて真の条件をOR条件でつないでもかまいません。
0419NAME IS NULL
垢版 |
2018/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 NULL
垢版 |
2018/07/17(火) 05:22:06.92ID:???
>>413
おれなら11個も同一テーブルからのunion allとか書いてたらアホかと思うけどな
whereで11個or条件書く方がマシだわ
どっちにしても、9個以上が8個以上とか7個以上とかになったらどうするんだろうね

ああ、たんに最近union覚えて使いたいだけか

理解できてないのはお前のunionに対する実行効率だよ

まあ>>397がループのネストとか俺には意味不明だから、俺を遙かに超越した理解の持ち主なのかもしれんが
0421NAME IS NULL
垢版 |
2018/07/17(火) 06:35:01.38ID:???
環境はそれぞれだったら、いろんな方法を試したらいいんじゃない?
で、目的に一番合うもの選べば。
0422NAME IS NULL
垢版 |
2018/07/17(火) 07:11:11.28ID:???
効率云々の前にunion allとかにしたら重複行の扱いで結果異なるし
>>417が正解かと
0423NAME IS NULL
垢版 |
2018/07/17(火) 11:41:13.48ID:???
まあちゃんとnot条件書けばいちおうunionでもunion allでも同じになるんじゃね
unknownになるような条件書かなきゃな
0424NAME IS NULL
垢版 |
2018/07/17(火) 19:05:25.28ID:???
>403
どっちがスマートかと言えば、unionで繋げた方が"sql文"としてはスマートかな
0425NAME IS NULL
垢版 |
2018/07/17(火) 20:31:21.01ID:???
現実社会じゃクイズ解いてるわけじゃないんだから、アプリ側でやっちゃうだけ
0426NAME IS NULL
垢版 |
2018/07/17(火) 20:40:16.91ID:???
>>425
この例で
アプリ側でどんなクエリ発行してどんなロジックでチェックするのか教えてくれ
0427NAME IS NULL
垢版 |
2018/07/17(火) 21:16:08.13ID:???
>>424
だからSQL書いてみろって
書いてる間に顔真っ赤になるだろ w
0428NAME IS NULL
垢版 |
2018/07/17(火) 21:20:42.11ID:???
お前は読めるのか?
0429NAME IS NULL
垢版 |
2018/07/17(火) 22:10:19.21ID:???
unionおじさんの次の一手は誰も言ってない要件を持ち出す、かな
0430NAME IS NULL
垢版 |
2018/07/17(火) 22:47:07.54ID:adSOPTjX
UNIONとUNION ALLはまったく別物だ。
0431NAME IS NULL
垢版 |
2018/07/17(火) 22:50:39.33ID:adSOPTjX
>>422
だから質問者のWHERE句での条件でいいのに。
なんでSQLを直すことになったらすぐにWHERE句全体が崩壊する方法を勧めるひとがいるの?
0432NAME IS NULL
垢版 |
2018/07/17(火) 22:57:06.79ID:adSOPTjX
>>422
確かにUNION ALLでは同じレコードが返ってくることには気づかなかった。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況