- ベストアンサー
UNION ALLのように順番がありNULLを返す方法
SQL初心者です。ACCESSデータベースに対するクエリを書いているのですが、 条件を配列として、その配列の順番に応じたSELECT文を書きたいのです。 SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL SELECT * FROM access_db WHERE ID = '条件' UNION ALL... といった具合にSQL文を作成しているのですが、これでは見つからない条件がある場合に、行が繰り上がり条件を格納した配列とはずれが生じてしまいます。 見つからなかった場合にNULLまたはそれを表せる何かを抽出結果として組み込むことはできますか? SQL初心者のためUNION ALL程度しか近いものが見つけられなく、困っています。 どなたかよろしくお願いします。
- make_midi
- お礼率88% (16/18)
- その他(データベース)
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
条件だけを格納したテーブルを作り、これと LEFT JOIN するのが、 スッキリした方法です。但し、そのような方法がとれない場合は チョット強引なやり方ですが、以下をお試しください。 SELECT B.* FROM (SELECT TOP 1 '条件1' AS C FROM access_db) AS A LEFT JOIN access_db AS B ON A.C = B.ID UNION ALL SELECT B.* FROM (SELECT TOP 1 '条件2' AS C FROM access_db) AS A LEFT JOIN access_db AS B ON A.C = B.ID UNION ALL ・・・
その他の回答 (1)
- nfushi
- ベストアンサー率31% (39/122)
UNION ALLではなくORやINを使用されてはどうでしょうか? SELECT * FROM access_db WHERE ID = '条件1' OR ID = '条件2' OR ID = '条件3' OR ID = '条件4' //////////// SELECT * FROM access_db WHERE ID IN ('条件1','条件2','条件3','条件4')
補足
この時に焦っていたため、質問の意図が判りにくいかもしれません。 申し訳ありません。 この場を借りて、質問の補足をさせていただきます。 私が実現したいのは、UNION ALL で結合された条件付SELECT文に対し、 その条件に一致するものがなければNullの結果フィールドを返すといったものです。 つまり、条件1、条件2、条件3、、、といった条件を格納した 配列があるとして、それに対し 条件1で抽出された値、条件2で抽出された値、条件3で抽出された値、、、 といったように"ずれ"のない結果が欲しいのです。 UNION ALL で見つかったものを順番に返すといった結果は得られたのですが、 見つからなかった場合にそのことを教えてもらう方法がわからないため、 条件が20あった場合に結果が18しかないということになってしまいます。 Nullを返すというのが無理ならば、"about no match"といった文でも良いのですが・・・。
関連するQ&A
- ユニオンクエリでWHERE句を使うのは不可能でしょうか?
アクセス2003です。 (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); WHERE (((番号) Like "*001")); としても 「SQLステートメントの後に文字が見つかりました。」 となってしまいます。 「番号」と言うフィールドは Q1、Q2、Q3どのクエリにもあり (select * from Q1) UNION ALL (select * from Q2) UNION ALL (select * from Q3); のみなら正常に動作します。 作成したユニオンクエリで「フィルタの対象」で「*001」と入力したらちゃんと思い通りに動作します。 ユニオンクエリで条件抽出は不可能でしょうか? よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- ユニオンクエリの保存方法
SELECT * FROM 西クエリ UNION ALL SELECT * FROM 神戸クエリ; UNION ALL SELECT * FROM 東クエリ; UNION ALL SELECT * FROM 戸西クエリ; UNION ALL SELECT * FROM 西クエリ; UNION ALL SELECT * FROM 宮北クエリ; UNION ALL SELECT * FROM 尼クエリ; UNION ALL SELECT * FROM 馬クエリ; 以上のユニオンクエリを組みました これを ファイル名"森本"エクセルに保存したいのですが 命令文を指導願います
- ベストアンサー
- その他(データベース)
- ユニオンクエリで0と表示される。
教えてください。 4つのテーブルをユニオンクエリでひとつにしたく以下のようにSQLに書きました。 SELECT ID AS フィールド1 ,No AS フィールド2, Remark AS フィールド3 FROM テーブル1 UNION ALL SELECT ID,No,Remark FROM テーブル2 UNION ALL SELECT ID,No,Remark FROM テーブル3 UNION ALL SELECT ID,No,Remark FROM テーブル4 フィールド2のNOには数字が入っているのですがフィールド2の列にはすべて0と表示されて数字がででてきません。ID(オートナンバー型)とRemark(短いテキスト型)はちゃんと表示されます。もとのテーブル1と2のNoは数値型 テーブル3と4のNoは短いテキスト型です。なにが原因でどうしたら数値が表示されるようになりますか?
- 締切済み
- Access(アクセス)
- SELECT 文の NULL列は?
ある人に、こんなSQLを教えてもらいました。 ----------------------------- select id,tid,NULL as "res_no",account_id,name,date from t_game_bbs as a union select id,tid,res_no,account_id,name,date from t_game_res as b where del_flg != 1'; order by date DESC limit 10; -------------------------------- 不思議に思ったのが、”NULL as "res_no"”のところです。 これについて、ググッて見たのですが、明確な説明が見つかりませんでした。 これって、SQLの隠し機能なのですか?
- ベストアンサー
- PostgreSQL
- WHEREでヌルをスルーしたい
いつもお世話になっております。 SQL文のワイルドカードについての質問なのですが、 SELECT 項目1 FROM 表 WHERE 項目1 LIKE '%' というSQLがあったとして、私は項目1のレコードがすべて返されるのかと思いました。 しかしこれだと項目1フィールドにNULLが入っている(何もデータが入っていない)場合、それは除かれてしまうようです。 NULLのレコードも含めてクエリを返してくれるような条件はあるのでしょうか?
- ベストアンサー
- SQL Server
- union allで空白を残す方法
SQL Serverでunion allを使った時、空白を残す方法はありますでしょうか。 具体的には以下のようなケースです。 select 1 as A union all select '' as A の結果は A 1 0 というように自動的に0が入りますが、0ではなく空白にする方法を探しています。 ご存じの方教えていただけますでしょうか。 宜しくお願い致します。
- ベストアンサー
- SQL Server
- SQLのUNIONを使って…
SQLでUNIONを使ったあるメソッドがあります。 まずは、例を見せます。 SELECT '1' AS ID, '' AS 名前, FROM 情報 UNION SELECT ID, 名前 FROM 情報 ORDER BY ID 二つのテーブルを合体させた後、 IDを昇順に変更します。 しかし、「'1'のID」に限りレコードの最下部に表示したい。 ID順に並べ替えると最小値である'1'は当然、最上部に出ますが、 これを最下部にする事が目的です。 また、UNIONの上下にあるSELECT文を 互いに入れ替える等は禁止となっています。 環境は、オラクル10G。 CSEを使ってテストしています。
- ベストアンサー
- その他(プログラミング・開発)
- UNION ALLでつなげた複数ビューの集計
お世話になっています。 現在下記のようなSQLを組んでいます。 ビュー1の集計結果 UNION ALL ビュー2の集計結果 UNION ALL ビュー3の集計結果 実行結果 例 年月 人数 金額 201104 3 20000 201105 2 10000 201104 1 5000 GROUP BY句で年月を集計したビューをUNION ALLでつないでいるため、 当然のように同じ年月が何度も出てくるため、テストがしづらくなっています。 やりたいこととしては、さっきの実行結果をさらに年月で集計することを 考えています。 年月 人数 金額 201104 4 25000 201105 2 10000 対策として、下記のように集計したビューをUNION ALLでつないだ結果を さらに集計するSQLを作りました。 SELECT FROM( ビュー1の集計結果 UNION ALL ビュー2の集計結果 UNION ALL ビュー3の集計結果 ) GROUP BY その結果、下記のエラーが発生しました。 ORA-00935:グループ関数のネスト・レベルが深すぎます。 環境はoracle11gです。 あとは、SQLのFROM句の()の部分をビューとして作成し、 更にそのビューを呼び出して集計するくらいしか思いつかないです。 今回作ろうとしてるのはテスト用のSQLのため、SQL文と実行結果を残したいので、 できればビューやプロシージャーは作らずに、SQLのみで作成したいと考えています。 何か良い方法はありますでしょうか? 宜しくお願い致します。
- ベストアンサー
- Oracle
- UNION ALLしたテーブルを個別に並べ変え
table1、table2、table3というテーブルがあり このそれぞれをidというカラムで並び替えたものを結合するので考えました。 SELECT * FROM `table1` UNION ALL SELECT * FROM `table2` UNION ALL SELECT * FROM `table3` ORDER BY `id` にすると全てを結合したものを並び替えるので SELECT *, '1' AS tbl FROM `table1` UNION ALL SELECT *, '2' AS tbl FROM `table2` UNION ALL SELECT *, '3' AS tbl FROM `table3` ORDER BY `tbl`,`id` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。
- 締切済み
- MySQL
お礼
"条件だけを格納したテーブルを作り、これと LEFT JOIN するのが、 スッキリした方法です。" という、文面からヒントを得て、こちらで解決致しました。 ちょっと質問とは違う出力結果になりましたが、 以前考えていたものより、効率的な結果が得られました。 配列にズレが生じないように、 keyとなるものを同時に抽出するという方法で対処しました。 ありがとうございました。