• 締切済み

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

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です。 よろしくお願いします。

みんなの回答

回答No.1

こんな感じでしょうか??? SELECT テーブル1.ID, テーブル1.NAME, テーブル2.NAME, テーブル2.月, テーブル2.開始日, テーブル2.終了日 FROM テーブル1 LEFT OUTER JOIN テーブル2 ON テーブル1.ID = テーブル2.DB1_ID

ymda
質問者

お礼

イメージ的には、以下の様なSQLですが、Accessだとダイヤログで空値を入力する必要があり、VB上だとエラーになってしまいます。 NULL値をDBをいじらず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;

ymda
質問者

補足

この場合ですと 1,おなまえ,4月,2006/4/1,2006/4/30 2,おなまえ,6月,2006/6/1,2006/6/30 3,名前,2006年度,2006/4/1,2007/3/31 4,なまえ,(null),(null),(null) になってしまいます><

関連するQ&A

  • 以下の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; よろしくお願いします。

  • データコンボのNullについて

    何度もすいませんm(__)m データコンボで 値が選択されてない場合は nullをデータベースに格納したいんですが、 できません。nullの使い方が不正です。と出ます。 教えてください。 VB6を使ってますデータベースはMySQLです。 Dim id As Integer If Me.DataCombo1.Text = "" Then id = Null Else id = Me.DataCombo1.SelectedItem End If datacombo1はInteger型のデータを データベースに格納します

  • 抽出したデータから、別のフィールドのデータを見るには?

    説明が下手でごめんなさい。初心者なので用語もちゃんと使えてませんが、アドバイスおねがいします。 住所録を作っていて、ID・NAME・ADDRESSの3つのフィールドがあります。 今はNAMEのデータを一覧で出せるだけなのですが、 NAMEの全データをを1個ずつ押せるように(ハイパーリンクのように?)して、そのNAMEデータに対応したADDRESSのデータを見られるようにしたいのですが、何かいい方法はありませんか? OSはWindowsXP DBはACCSESS2000で、 ASPを使っています。

  • 期間を抽出する方法について

    データに賞味期限(開始)、賞味期限(終了)があります。 基準日を元にデータの賞味期限内に該当するデータを抽出したいと思いますが、どのような条件で抽出することが出来ますでしょうか? ご教授頂けると助かります。宜しくお願いします。 【例】 基準日:2021/05/01 希望する抽出データ 商品 賞味期限(開始)賞味期限(終了) A  2021/05/26   Null B  2021/05/10   Null 【データ】 商品 賞味期限(開始)賞味期限(終了) A  2021/05/26   Null B  2021/05/10   Null C  2021/04/01   2021/04/30 D  2021/03/15   Null E  2021/03/01   2021/03/14 以上です。

  • 開始日と終了日が設定されているデータの扱いについて

    開始日と終了日が設定されているデータの扱いについて教えてください。 すでに複数登録されているデータには、開始日と終了日というフィールドが登録されています。  → "開始日","終了日","箱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
  • sqliteへのデータ追加

    sql文で質問です。接続は1-29の表示を確認済み。 掲示板を作る練習をしているのですが、とりあえずpostなどのユーザーから受け取り値をdbに保存・表示する前に、自分で保存(カラムは左から順にid,name,sexになっていてidの1~29は埋まっている状態です。)・表示してみようと思いtest.dbのhumanテーブルに「データの追加」と表記している部分をテーブルに書き込み表示したいのですが、エラーは表示されないもののid30番にデータの追加ができておらず困っています。 データを追加する方法を教えてください。 <?php // 変数の初期化 $db = null; $sql = null; $res = null; $row = null; $db = new SQLite3("test.db"); // データの追加 $sql = 'INSERT INTO human( id, name, sex, ) VALUES ( 30, "吉川", "男", )'; // データの取得 $sql = 'SELECT * FROM human WHERE id BETWEEN 1 AND 50;'; $res = $db->query($sql); while( $row = $res->fetchArray() ) { echo '<ul>'.'<li>'. $row[0] . $row[1] .$row[2].'<li>'.'<ul>';} ?>

  • アクセスで指定した月のデータを抽出したい

    アクセスは初心者なので、初歩的な質問だと思いますが、お願いします。 月別データで○月~○月のデータを抽出したい場合ですが、現在クエリを使いbetween [開始月] and [終了月]で抽出するようになっています。(開始月、終了月は使用する人が各自で見たい月を入力します) ですが、これでは開始月が終了月より大きかった場合(例えば 開始月3月、終了月1月)終了月~開始月のデータが抽出されてしまいます(1月~3月のデータが抽出されてしまう。) こういう場合 どのように修正すれば、きちんとしたデータを抽出できるのでしょうか。 よろしくお願いします。

  • PHPとMySQLを使ったフォームを作っていますが、うまくできないこと

    PHPとMySQLを使ったフォームを作っていますが、うまくできないことがあり書き込みさせていただきます。 わかる方、ご助力願えれば幸いです。 フォームから、送信されたデータを受け取って、MySQLに登録する際に、フォーム内に空欄があると、うまくMySQLのデータベースに追加ができなかったり、変更ができなかったりします。 コードを簡単に書くと… <?php //フォームからデータを取得 $name = $_POST['name']; $address = $_POST['address']; $age = $_POST['age']; //データベース接続処理 $db = mysql_connect("localhost","user","password"); mysql_select_db("db_name",$db); $rs = mysql_query("select * from tablename order by my_id desc",$db); //データベースへの登録 $rs = mysql_query("INSERT INTO tablename(name,address,age)VALUES('$name','$address','$age')",$db); ?> このような感じになります。 フォームには、名前、住所、年齢を入力しているわけですが、年齢が必須でないため、空欄として送られてくることもあります。 年齢に数値が入っている場合は、うまく登録されますが、空欄であった場合、特にエラーが出るわけでもなく、単に「登録されない」という状況がおきます。 データベースのテーブルのフィールドでは、ageは int(11)でNULLはYes、defaultはNULLになっております。 自分なりに調べてみたつもりですが、知りたい情報に出合うことができませんでした。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • phpでmysqlのデータがupdateできません。

    仕様Apache2.0 PHP5.1.6 MySQL5.0.27 です。 以下の通りです。どこがだめですか? <FORM method="POST" action="order_regist.php"> <INPUT type="hidden" name="id" value="<?=$id?>"> <INPUT type="hidden" name="order_day" value="<?=$order_day?>"> <INPUT type="hidden" name="order" value="依頼あり"> <INPUT type="submit" value="同意して作業を依頼"> </FORM> 上記を次ページへ送信 以下次ページ /* MySQL DB接続情報の設定 DB名/ユーザー名/パスワード */ define("DB_NAME", "*****"); define("DB_USER", "*****"); define("DB_PASS", "*****"); /* リクエストデータの取得 */ $id = $_REQUEST["id"]; $order_day = $_REQUEST["order_day"]; $order = $_REQUEST["order"]; /* MySQLに接続 */ $link = mysql_connect("localhost", DB_USER, DB_PASS) or die("MySQLとの接続に失敗しました。"); /* 接続データベースを選択 */ mysql_select_db(DB_NAME) or die("データベースとの接続に失敗しました。"); /* クライアントのキャラクタセットを変更 */ mysql_query("SET NAMES ujis") or die( "クエリーの実行に失敗しました" ); /* データを更新するクエリーを設定 */ $query = "UPDATE all_cleaning_user SET order = '" . $order . "', order_day = '" . $order_day . "' WHERE id = " . $id; /* データベースにクエリーを実行 */ mysql_query($query) or die("クエリーを実行できませんでした。"); /* MySQLより切断 */ mysql_close($link); クエリーを実行できませんでしたのエラーが出ます。なぜですか?

    • ベストアンサー
    • PHP
  • 複数のテーブルに対しSQLでデータを取得する方法

    下記の2つのテーブル、及びソースコードがあります。 【sample_db】 CREATE TABLE IF NOT EXISTS `sample_db` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `path` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `path` (`path`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; INSERT INTO `sample_db` (`id`, `name`, `path`) VALUES (1, '2010年', '.1.'), (2, '6月', '.1.2.'), (3, '28日', '.1.2.3.'); 【sample_students】 CREATE TABLE IF NOT EXISTS `sample_students` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sample_db_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; INSERT INTO `sample_students` (`id`, `sample_db_id`) VALUES (1, 1), (2, 2), (3, 3); 【ソースコード】 <body> <?php $link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名'); mysql_select_db('データベース名', $link); $sql = <<<SSS SELECT `SampleDb`.`id` , `SampleDb`.`name` , `SampleDb`.`path` , `sample_students`.`id_count` FROM `sample_db` AS `SampleDb` LEFT JOIN ( SELECT count( `sample_db_id` ) AS `id_count` , `sample_db_id` AS `sample_db_id` FROM `sample_students` GROUP BY `sample_db_id` ) AS `sample_students` ON ( `SampleDb`.`id` = `sample_students`.`sample_db_id` ) ORDER BY `SampleDb`.`path` SSS; $query = mysql_query($sql, $link); $p = 0; while ($row = mysql_fetch_array($query)) { $starter= "\n"; $rp = intval( $row['depth'] ); if( $p< $rp ){ // 子の開始 $p ++; $starter .= "<ul><li>"; }else { if( ($dp= $p-$rp) >0 ){ $p = $rp; $starter .= str_repeat('</li></ul>', $dp); } $starter .= '</li><li>'; } echo "$starter $row[1]: $row[2] :【$row[3]】"; } echo "\n". str_repeat('</li></ul>', $p) ; mysql_close($link); ?> </body> 上記の表示結果は、下記のようになります。 【表示結果】 2010年: .1. :【1】 6月: .1.2. :【1】 28日9: .1.2.3. :【1】 これを下記のような表示結果に変更する事は可能でしょうか? 2010年: .1. :【3】 6月: .1.2. :【2】 28日: .1.2.3. :【1】 やりたい事は、2010年には、それ以下に所属する合計を出したいと思いました(6月なども同様です)。 現在は、2010年そのものしか出せておりません。 pathフィールドの検索の仕方を考慮する必要があると思いましたが、どのようなSQL文を書けば良いか分からなかった為、 アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう