準備
drop table nums; create table nums ( n int not null ); insert into nums values(1); insert into nums values(2); insert into nums values(3); insert into nums values(4); insert into nums values(5); insert into nums values(6); insert into nums values(7); insert into nums values(8); insert into nums values(9);
実現したかったこと
select * from (select * from nums where n % 3 = 0) as t1 where n > (select avg(n) from t1) ;
レコードが1件のみで、値は9
という結果を期待した。
発生している問題・エラーメッセージ
ERROR: リレーション"t1"は存在しません LINE 6: n > (select avg(n) from t1) ^
試したこと
--(1)where句にも同じ条件を記載 select * from (select * from nums where n % 3 = 0) as t1 where n > (select avg(n) from nums where n % 3 = 0) ;--OK 9 --(2)一旦、テーブルを作ってそれを参照(共通テーブル式) with m3(n) as ( select * from nums where n % 3 = 0 ) select * from m3 where n > (select avg(n) from m3) ;--OK 9 --(3)更に単純な例 select * from nums where n > (select avg(n) from nums) ;--OK 6,7,8,9 select * from nums as t1 where n > (select avg(n) from t1) ;--NG リレーション"t1"は存在しません
補足
本当にやりたかったことはもっと複雑なテーブル&もっと複雑な条件です。
質問用に簡易的なテーブルで再現させています。
試したことの(1)は、可読性が悪く、ミスの混入しやすさ等を考慮して却下。
試したことの(2)は、いちいちテーブル作るのは後処理やトランザクションが面倒。
共通テーブル式は妥協できるレベルですが、割と新しい機能っぽいので、昔の人はどうしてたのかなと。。。
もっとスマートな方法があるはず!と思い、質問させていただきました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。