前提・実現したいこと
後述のテーブルで、以下ような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.id
とtest2.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
テーブル
id | foo |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 2 |
CREATE文
sql
1CREATE TABLE `test` ( `id` INTEGER, `foo` INTEGER NOT NULL, PRIMARY KEY(`id`) )
test2
テーブル
id | id2 |
---|---|
1 | 1 |
2 | 2 |
3 | 2 |
4 | 3 |
5 | 3 |
6 | 3 |
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
よろしくお願いいたします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/29 04:15