• ベストアンサー

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程度しか近いものが見つけられなく、困っています。 どなたかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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 ・・・

make_midi
質問者

お礼

"条件だけを格納したテーブルを作り、これと LEFT JOIN するのが、 スッキリした方法です。" という、文面からヒントを得て、こちらで解決致しました。 ちょっと質問とは違う出力結果になりましたが、 以前考えていたものより、効率的な結果が得られました。 配列にズレが生じないように、 keyとなるものを同時に抽出するという方法で対処しました。 ありがとうございました。

その他の回答 (1)

  • nfushi
  • ベストアンサー率31% (39/122)
回答No.1

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')

make_midi
質問者

補足

この時に焦っていたため、質問の意図が判りにくいかもしれません。 申し訳ありません。 この場を借りて、質問の補足をさせていただきます。 私が実現したいのは、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は短いテキスト型です。なにが原因でどうしたら数値が表示されるようになりますか?

  • 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の隠し機能なのですか?

  • WHEREでヌルをスルーしたい

    いつもお世話になっております。 SQL文のワイルドカードについての質問なのですが、 SELECT 項目1 FROM 表 WHERE 項目1 LIKE '%' というSQLがあったとして、私は項目1のレコードがすべて返されるのかと思いました。 しかしこれだと項目1フィールドにNULLが入っている(何もデータが入っていない)場合、それは除かれてしまうようです。 NULLのレコードも含めてクエリを返してくれるような条件はあるのでしょうか?

  • union allで空白を残す方法

    SQL Serverでunion allを使った時、空白を残す方法はありますでしょうか。 具体的には以下のようなケースです。 select 1 as A union all select '' as A の結果は A 1 0 というように自動的に0が入りますが、0ではなく空白にする方法を探しています。 ご存じの方教えていただけますでしょうか。 宜しくお願い致します。

  • 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について

    お世話になります。 Oracle11gで開発をしています初心者です。 下記の様なSQL文で、 テーブル内の全データが抽出されないのですが 何故でしょうか。 同じ内容の行が複数あっても、1行しか抽出され ないのです。 本当に初心者の質問で申し訳ございませんが、 ご教示頂きたく宜しくお願い致します。          記 SELECT 登録日時,品番,品名,入庫数,NULL AS 出庫数 FROM T入庫 UNION SELECT 登録日時,品番,品名,NULL AS入庫数,出庫数 FROM T出庫

  • 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のみで作成したいと考えています。 何か良い方法はありますでしょうか? 宜しくお願い致します。

  • 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` という風に書いてみました、結果としてはよさそうですが 方法としては間違ってないでしょうか? 他にいい方法があればアドバイスをお願いします。