質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

1回答

1117閲覧

SQLで期待通りの結果が返ってこない。また、CASE式におけるELSEが機能していない?

defeatist

総合スコア35

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2020/08/28 18:51

前提・実現したいこと

後述のテーブルで、以下ようなSQLを実行した際に、期待通りの結果を返してほしい

sql

1with rows as ( 2 select test.id, count(*) cnt 3 from test 4 join test2 on test.id = test2.id2 5 where test.foo =1 6 group by test.id 7), 8temp as ( 9 select id 10 from rows r2 11 where r2.cnt = (select max(r1.cnt) 12 from rows r1) 13), 14temp2 as ( 15 select test.id 16 from test 17 where test.id =2 18) 19 20select case 21 when temp.id is not null then temp.id 22 when temp2.id is not null then temp2.id 23 else 99 24end as result 25from temp, temp2

test.idtest2.id2の部分で内部結合させ、test.idごとのレコード数をカウントし、そのレコード数が最大のものがある場合は、そのid(temp.id)を、次にtest.idにはあるがtest2.id2にそれと同じ値がない場合は、そのtest.id(temp2.id)を、これら以外の場合(想定外、テスト目的なので本来は不必要)の場合は99を出力したいです

また、

  • 値1値2の組み合わせは、testテーブルのレコードに基づいて指定されます(具体的には、testテーブルのレコードのそれぞれの値が、ある1つのURIのパラメータに含まれているようなイメージです)
  • test.idに存在しない値2は指定しません(temp2が最後の受け皿なので)

発生している問題・エラーメッセージ

  • test2.id2に存在しない値2を指定した組み合わせの場合の結果が期待通りでない
  • CASE式におけるELSEが機能していない?

該当のソースコード

testテーブル

idfoo
11
21
31
42

CREATE文

sql

1CREATE TABLE `test` ( `id` INTEGER, `foo` INTEGER NOT NULL, PRIMARY KEY(`id`) )

test2テーブル

idid2
11
22
32
43
53
63

CREATE文

sql

1CREATE TABLE `test2` ( `id` INTEGER, `id2` INTEGER NOT NULL, PRIMARY KEY(`id`) )

試したこと

  • testテーブルとtest2テーブルを内部結合した結果のテーブルにレコードが存在する場合のtest.id値1にしていした場合

sql

1with rows as ( 2 select test.id, count(*) cnt 3 from test 4 join test2 on test.id = test2.id2 5 where test.foo = 1 6 group by test.id 7), 8temp as ( 9 select id 10 from rows r2 11 where r2.cnt = (select max(r1.cnt) 12 from rows r1) 13), 14temp2 as ( 15 select test.id 16 from test 17 where test.id = 1 18) 19 20select case 21 when temp.id is not null then temp.id 22 when temp2.id is not null then temp2.id 23 else 99 24end as result 25from temp, temp2
結果(期待通り)

result: 3


  • test2.id2に存在しない値2を指定した組み合わせの場合

sql

1with rows as ( 2 select test.id, count(*) cnt 3 from test 4 join test2 on test.id = test2.id2 5 where test.foo = 2 6 group by test.id 7), 8temp as ( 9 select id 10 from rows r2 11 where r2.cnt = (select max(r1.cnt) 12 from rows r1) 13), 14temp2 as ( 15 select test.id 16 from test 17 where test.id = 4 18) 19 20select case 21 when temp.id is not null then temp.id 22 when temp2.id is not null then temp2.id 23 else 99 24end as result 25from temp, temp2
結果(期待通りではない)

結果なし(0レコード)

期待する結果

result: 4

  • 最後の受け皿なので、絶対にここで結果を返してほしい

補足情報(FW/ツールのバージョンなど)

Microsoft Windows10 バージョン 1903(OSビルド 18362,1016)
SQLite 3.22.0


よろしくお願いいたします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結果が却って来ないのは、直積の片側が0件なら、結果(0との積算)は0件だからです。
full join すれば結果は却ります。

SQL

1select case 2 when temp.id is not null then temp.id 3 when temp2.id is not null then temp2.id 4 else 99 5end as result 6from temp full join temp2 7 on temp.id=temp2.id

やりたいことがいまいち理解できませんが、組み替えてみました。

SQL

1with rows as ( 2 select id2, count(*) cnt from test2 3 group by id2 4), temp as ( 5 select id2 from rows 6 where cnt = (select max(cnt) from rows) 7) 8select * 9from test 10where ( 11 id in (select ID2 from temp) -- レコード数が最大のものがある場合 12 or not exists( -- 同じ値がない場合 13 select 1 from test2 where id2=test.id 14 ) 15 ) 16 and (foo =1 or id =2)

投稿2020/08/28 19:18

編集2020/08/29 03:34
sazi

総合スコア25184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

defeatist

2020/08/29 04:15

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問