AccessMDBでのSQLクエリーについての対応方法

このQ&Aのポイント
  • AccessMDBで指定のテーブルを結合するSQLクエリーを実行した際に、nullの値を含める方法を教えてください。
  • テーブル1とテーブル2を結合する際に、テーブル2に該当する値が存在しない場合には、nullの値を表示させたいです。
  • どのようなSQL文を記述すれば、テーブル2に値が存在しない場合にもnullを含めることができるでしょうか?
回答を見る
  • ベストアンサー

以下のSQLについて

AccessMDBで、以下のテーブルがあったとします。 テーブル1 ID,NAME 1,おなまえ 2,名前 3,なまえ テーブル2 ID,DB1_ID,NAME,開始日,終了日 1,1,4月,2006/4/1,2006/4/30 2,1,6月,2006/6/1,2006/6/30 3,2,2006年度,2006/4/1,2007/3/31 このとき、以下のように出力したいのですが ID(オートナンバーと仮定),NAME,月,開始日,終了日 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,おなまえ,(null),(null),(null) 4,名前,2006年度,2006/4/1,2007/3/31 5,名前,(null),(null),(null) 6,なまえ,(null),(null),(null) 試しにクェリーを作ってみた所、(null)の値を手入力しなければいけないのですが nullをいれさせるようにするには、どのようにしないといけないでしょうか? #テーブルをいじることはできず、SQLのみで対処することを考えています。 SELECT テーブル1.NAME, テーブル2.NAME, テーブル2.START, テーブル2.END FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.ID=テーブル2.DB1_ID UNION SELECT テーブル1.NAME, テーブル2.NAME,テーブル2.START,テーブル2.END FROM テーブル1; よろしくお願いします。

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

  • ベストアンサー
  • K_3113
  • ベストアンサー率46% (15/32)
回答No.4

UNIONの後のSELECT文ではテーブル2の値は不要なのではないでしょうか? これでどうでしょう? (SELECT テーブル1.NAME, テーブル2.NAME, テーブル2.START, テーブル2.END FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.ID=テーブル2.DB1_ID ) UNION SELECT NAME,null,null,null from テーブル1;

ymda
質問者

お礼

このままそっくりコピペして通りました。 ありがとうございます。 早速組み込んでみたいとおもいます。

その他の回答 (3)

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

Accessのmdbならこんな感じでSQL発行できませんでしょうか。 SELECT テーブル1.NAME, テーブル2.NAME, テーブル2.開始日, テーブル2.終了日 FROM テーブル1 LEFT JOIN テーブル2 ON テーブル1.ID=テーブル2.DB1_ID UNION SELECT テーブル1.NAME, (IIf(IsNull(テーブル2.NAME),"Null",テーブル2.NAME)) AS N,(IIf(IsNull(テーブル2.開始日),"Null",テーブル2.開始日)) AS S,(IIf(IsNull(テーブル2.終了日),"Null",テーブル2.終了日)) AS E FROM テーブル1; これでほぼ近いと思うのですが。

ymda
質問者

補足

やはり、入力ダイアログが出てしまいます。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

そういう場合はご自分ローカルPCにデータをコピーしましょう。 それからデータを加工すればいいのでは?・・・ とにかく抽出してデータを抜き出す工夫をして別なmdbもしくは MSDEなどにDBを作成すればOKだと思いますが。 そのほかEXCELに読み込んで加工するなどの方法もありますが

ymda
質問者

補足

うーん、そういうわけにもいきません。 また、毎月1回、うん万件が素人が動かすシステムに組み込みますので・・・ その関係で、新たなテーブルも作れない状態です。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.1

Insert INTO を用いて別テーブルへ追加すれば可能です。 STEP(1): TABLE_1 の定義内容が ID (オートナンバー型) 主キー DB1_ID (INT型) 氏名(テキスト型) 名称(テキスト型) 開始日(日付・時刻型) 終了日(日付・時刻型) としてデータを入れます。 STEP(2): TABLE_2 の定義内容が ID (オートナンバー型) 主キー 氏名(テキスト型) としてデータを入れます。 STEP(3): あらかじめ出力先テーブル(TABLE_3)を作成します。 ID (オートナンバー型) 主キー 氏名(テキスト型) 名称(テキスト型) 開始日(日付・時刻型) 終了日(日付・時刻型) データは空にしておきます。 STEP(4): 追加クエリ「TABLE_1からTABLE_3作成」という名前で作成します。 INSERT INTO TABLE_3 ( 氏名, 名称, 開始日, 終了日 ) SELECT Table_1.氏名, Table_2.名称, Table_2.開始日, Table_2.終了日 FROM Table_2 LEFT JOIN Table_1 ON Table_2.DB1_ID = Table_1.Id ORDER BY Table_2.ID; STEP(5): 追加クエリ「TABLE_1からTABLE_3作成」という名前で作成します。 Insert INTO TABLE_3(氏名, 名称, 開始日, 終了日) SELECT Table_1.氏名, NULL as 名称,NULL as 開始日,NULL as 終了日 FROM Table_1 where ID in(2,3) order by ID 後は作成した追加クエリ(STEP(4),STEP(5))を実行すれば結果が TABLE_3 に作成されます。 自動化するにはマクロもしくはVBAを作成する必要があります。

ymda
質問者

補足

すみません。 テンポラリ用のテーブルの作成がダメなのも条件です。 #実際に動作するのは非常に大規模なmdbで、テーブル定義等を変更するのはほぼ困難であり、かつ、CREATE の権限が無い状態になっています。

関連するQ&A

  • 存在しないデータも抽出したい

    AcessMDBで困ってます。 例えば、以下のようなデータで(カンマCSVで記述します) データベース1 ID,NAME 1,おなまえ 2,名前 3,なまえ データベース2 ID,DB1_ID,NAME,開始日,終了日 1,1,4月,2006/4/1,2006/4/30 2,1,6月,2006/6/1,2006/6/30 3,2,2006年度,2006/4/1,2007/3/31 (データベース1のIDとデータベース2のDB1_IDが関連付けされている) とあるとき、以下のようにデータを出力したいのですが・・ ID(オートナンバー),NAME,月,開始日,終了日 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,おなまえ,(null),(null),(null) 4,名前,2006年度,2006/4/1,2007/3/31 5,名前,(null),(null),(null) 6,なまえ,(null),(null),(null) そして、where条件として、 2006/4/1が選択された場合 1,おなまえ,4月,2006/4/1,2006/4/30 2,名前,2006年度,2006/4/1,2007/3/31 3,なまえ,(null),(null),(null) 2006/7/1が選択された場合 3,おなまえ,(null),(null),(null) 2,名前,2006年度,2006/4/1,2007/3/31 3,なまえ,(null),(null),(null) 2007/4/1が選択された場合 3,おなまえ,(null),(null),(null) 2,名前,(null),(null),(null) 3,なまえ,(null),(null),(null) このような場合、どのようなSQLをかけばよろしいでしょうか? 言語はVS2003 VB.NET + AccessMDBです。 よろしくお願いします。

  • SQL

    テーブル情報 id start_dt end_dt --+----------+---------- 1 2014-01-07 2014-01-20 2 2014-01-08 Null 3 2014-01-09 Null 4 2014-01-10 Null 5 2014-01-11 Null を以下のSQL文の場合 select * from infomation where start_dt <= '2014/01/10' order by start_dt desc limit 3 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 2 2014-01-08 Null が取得されます。 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 1 2014-01-07 2014-01-20 の結果のように「id:2」よりも「end_dt」を優先して取得するSQL文をつくることは可能でしょうか? 何がしたいかというと ・start_dtが'2014/01/10'より新しい順に3件取得したい。 ・end_dtが'2014/01/10'より未来で該当する場合にNullのレコードより優先したい。 どうかお助けください。

    • ベストアンサー
    • MySQL
  • SQL

    テーブル情報 id start_dt end_dt --+----------+---------- 1 2014-01-07 2014-01-20 2 2014-01-08 Null 3 2014-01-09 Null 4 2014-01-10 Null 5 2014-01-11 Null を以下のSQL文の場合 select * from infomation where start_dt <= '2014/01/10' and (end_dt >= '2014/01/10' or end_dt is null) order by start_dt desc limit 3 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 2 2014-01-08 Null が取得されます。 id start_dt end_dt --+----------+---------- 4 2014-01-10 Null 3 2014-01-09 Null 1 2014-01-07 2014-01-20 の結果のように取得するSQL文をつくることは可能でしょうか? 何がしたいかというと ・start_dtが新しい順に並べる。 ・3件のレコードを取得する。 ・start_dtが'2014/01/10'より古いレコードを取得する。 ・end_dtが'2014/01/10'より新しいレコードがある場合は、Nullのレコードより優先する。 どうかお助けください。

    • ベストアンサー
    • MySQL
  • 開始日と終了日が設定されているデータの扱いについて

    開始日と終了日が設定されているデータの扱いについて教えてください。 すでに複数登録されているデータには、開始日と終了日というフィールドが登録されています。  → "開始日","終了日","箱1","箱2" → "051101","051130","a1","a2" → "051201","051231","b1","b2" 新しいデータを追加する際、すでに登録された期間に被っていた場合はエラー表示させたいのですが、そのやり方がわかりません。 (※12月1日~12月31日までというデータがすでに登録されていた場合、  11月1日~12月15日というデータは登録できない、という感じです) とりあえず下記のようにやったりしているのですが、 どうも思ったように動いてくれません また、SELECTを使うものなのか疑問に思っています。 $start_date = "2005-12-01" $end_date = "2005-12-31" $hoge = "SELECT * FROM table_name WHERE ( date_start<='"$start_data"' AND date_end>='"$start_data"' ) OR ( date_start<='"$end_data"' AND date_end>='"$end_data"')"; $db_query = sql_query($hoge,$ID); $array_result = mysql_fetch_array($db_query); if(empty($date_start_check) != TRUE ){ die("この期間内のデータはすでに登録されています。"); } 何卒、良いやり方を教えてくださいm(_ _)mペコリ

    • ベストアンサー
    • MySQL
  • 質問内容の仕様のSQLがわからない。

    MySQL5.0です。(+VB.NET2003) テーブル名 m_holiday_fixation HOLIDAY_NAME HOLIDAY_DATE START_YEAR END_YEAR みどりの日 0429      1989      2006 みどりの日 0504      2007      (NULL) このデータは1989年~2006年の4月29日ならびに2007年以降の5月4日は みどりの日という意味です。 この時2004年4月29日の時にみどりの日が戻るようなSQLを考えています。 SELECT HOLIDAY_NAME from m_holiday_fixation where (??) = '2004/04/29' START_YEAR と END_YEAR でBetWeenできそうな気がしますがうまく考えれません。 ストアドプロシージャに置き換えてでもいいのでアドバイスをお願いします。

    • ベストアンサー
    • MySQL
  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • PHP5+MySQLで現在日時とDB内の開始日時と終了日時との比較の方

    PHP5+MySQLで現在日時とDB内の開始日時と終了日時との比較の方法を教えてください。 table_a id start end ----+--------------------+---------------------+ 001 2010-01-01 10:00:00 2010-01-03 18:30:00 002 2010-01-01 12:00:00 2010-01-05 20:00:00 ・ ・ というデータがある時、 現在の日時がid:001のstartとendの間だったら1、 start前だったら0、endより後だったら2の値を表示させるにはどうしたらいいのでしょうか? $sql = "SELECT A.id ,A.start ,A.end FROM table_a A WHERE A.id = ".$id." "; $result = mysql_query($sql); で取得して time()などと比較すればいいとは思ってますが、DBから持ってきた日付との比較方法がわかりません。

    • ベストアンサー
    • PHP
  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • 同じ構成のテーブルの条件付き結合

    同じ構成のテーブルがテーブル1~テーブル6まであり、6つのテーブルを集計するSQLを作成しています。 カラムは ID、名前、日付1、日付2、ステータス1、ステータス2 です。 IDがプライマリーキーになっており、テーブル1にしかないIDや全てのテーブルに登録されているIDなどもあり、IDの一覧を作成したいです。 IDが重複していた場合、名前はどれを残しても構わないのですが(どのテーブルか指定する必要があるのならばとりあえずテーブル番号が若い方の名前を残すようにしてください。) 日付1は最古の日付 日付2は最新の日付 ステータスは共に優先順位が1>2>0>nullとなっており優先順位が高いほうを残すようにし、ステータスが両方nullの場合は集計しないようにしたいです。 テーブル1 ID、名前、日付1、日付2、ステータス1、ステータス2 111、あああ、2001/1/1、2001/1/1、2、2 222、いいい、2001/1/1、2001/1/1、2、2 333、ううう、2001/1/1、2001/1/1、null、null 555、おおお、2001/1/1、2001/1/1、2、2 テーブル2 ID、名前、日付1、日付2、ステータス1、ステータス2 111、aaa、2002/2/2、2002/2/2、0、null 222、iii、2002/2/2、2002/2/2、1、0 333、uuu、2002/2/2、2002/2/2、null、null 444、eee、2002/2/2、2002/2/2、1、1 結果 ID、名前、日付1、日付2、ステータス1、ステータス2 111、あああ、2001/1/1、2002/2/2、2、2 222、いいい、2001/1/1、2002/2/2、1、2 444、eee、2002/2/2、2002/2/2、1、1 555、おおお、2001/1/1、2001/1/1、2、2 このようなことを6つのテーブルを集計して行いたいです。 SELECT t1.id,MIN(t1.日付1)as 日付1,MAX(t1.日付2)as 日付2,CASE When t1.ステータス1="1" then "1" else t1.ステータス1 end ,CASE When t1.ステータス2="1" then "1" else t1.ステータス2 end FROM( SELECT * FROM テーブル1 UNION All SELECT * FROM テーブル2 UNION All SELECT * FROM テーブル3 UNION All SELECT * FROM テーブル4 UNION All SELECT * FROM テーブル5 UNION All SELECT * FROM テーブル6 )as t1 WHERE NOT(t1.ステータス1 IS null AND t1.ステータス2 IS null) GROUP BY id 日付は出来ていると思うのですが、ステータスで1の優先がまだ出来ていないので修正お願いいたします。

    • ベストアンサー
    • MySQL
  • SQL文の書き方

    次のような列の2つテーブルがあります ID,メッセージ,書いた日 ID,名前 一つ目のテーブルに メッセージを追加していき IDの違う最新のメッセージだけ取り出したいのですが 考えても分からなくて… SELECT ID,MAX(書いた日) FROM 一つ目のテーブル GROUP BY ID の時のIDそれぞれのメッセージが取り出せればいいのですが 最終的には IDの部分は別テーブルにある IDと一致する名前に置き換えて取り出したいと思っています よろしくお願いします データベースはPostgreSQLを使っています