• ベストアンサー
  • 困ってます

Nzを使用したサブクエリのLeftJOINのnul

Access 2016について質問があります。 以下の2つのテーブルがあります テーブル1 ID A B 1 a1 b1 2 a2 b2 3 a3 b3 テーブル2 ID 除外a 除外b 1 a1 (null) 2 (null) b1 テーブル2に対してnullを"*"に変更したサブクエリと テーブル1をLeftJoinで結合するクエリを作成します。 SELECT テーブル1.ID, a, b, Q.除外a, Q.除外b FROM テーブル1 LEFT JOIN (select ID, Nz(テーブル2.除外a,"*") as 除外a,Nz(テーブル2.除外b,"*") as 除外b from テーブル2) AS Q ON テーブル1.ID = Q.ID; 通常、Left Joinで結合する場合、右側のテーブルに存在しないIDは NULLになるはずです。 しかし、サブクエリにNzを使うとなぜか、nullにならず「*」になります。 (ID3の行の除外aと除外bがnullにならずに「*」になる) a b 除外a 除外b a1 b1 a1 * a2 b2 * b1 a3 b3 * * なぜこのようなことが起こるのでしょうか? この現象の回避方法はありますか?

共感・応援の気持ちを伝えよう!

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

  • ベストアンサー
  • 回答No.2
  • m3_maki
  • ベストアンサー率64% (283/438)

回避方法です。 SELECT [テーブル1].ID, a, b, Q.除外a, Q.除外b FROM テーブル1 INNER JOIN (SELECT ID, Nz([テーブル2].除外a,"*") AS 除外a, Nz([テーブル2].除外b,"*") AS 除外b FROM テーブル2) AS Q ON [テーブル1].ID = Q.ID; Union SELECT [テーブル1].ID,a,b, [テーブル2].除外a, [テーブル2].除外b FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].ID = [テーブル2].ID WHERE [テーブル2].ID Is Null;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど!Unionを使えばいいんですね。 この発想を思いつきませんでした・・・ 非常に助かりました。 ありがとうございます。

その他の回答 (1)

  • 回答No.1

今晩は Qが突然出てきて理解できませんが、次で狙い通りになります SELECT ID,A, B, 除外A,除外B FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].ID = [テーブル2].ID;

共感・感謝の気持ちを伝えよう!

質問者からの補足

説明が足りてなくてすみません。 そのSQLを実行すると下記の結果になります ID A B 除外A 除外B 1 a1 b1 a1 (null) 2 a2 b2 (null) b1 3 a3 b3 (null) (null) 実際に欲しいのはこちらです。 ID a b 除外a 除外b 1 a1 b1 a1 * 2 a2 b2 * b1 3 a3 b3 (null) (null) 「Q」というのはサブクエリのエイリアス(別名)です。

関連するQ&A

  • サブクエリを使わずに実現したのですが。。。

    現在、Mysql 4.0xを利用してDBを構築しています。 しかしながら、サブクエリが使えないため以下のようなクエリが実現できず困っております。 EX: select mg.*,sumlg.* from mg left join (select id,uid from lg where uid = '00001') as sumlg on mg.id = sumlg.id where sumlg.id is null; 上記SQLは特定のユーザーIDの、テーブルBに存在しないテーブルAのIDをユーザー単位で切り分け抽出するSQL文です。 (テーブルBにはIDとUIDでユニークになるレコードが格納されています。) 上記を実現するためのSQLをどなたかアドバイスください。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • viewでfrom句にサブクエリが書けない

    こんにちは。MYSQLのVIEWの代替についてお教え下さい。 下記でinner joinについて教えて頂きました。 http://okwave.jp/qa/q7296711.html 環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT A.z AS `在庫`,B.* FROM (SELECT SUM(stock) AS z FROM t1 WHERE id='001' GROUP BY id) A INNER JOIN t2 B ON A.id=B.id というコードで、それぞれのテーブルをグループ化してグループ化したもの同士をJOINしました。 このコードを元にVIEWを作り、そのVIEWを対象にクエリを作ろうと考えていました。 しかしながら、MYSQLのVIEWではFROM句でサブクエリは使えませんでした。 http://www.klab.jp/media/mysql/index4.html 上記のコードを書きなおして、なんとしてもVIEWで利用したいのですが、FROM句でサブクエリを使わずにVIEWを作成する方法がわかりません。 どのようにリライトすればよいか、ご助言お願い致します。

    • ベストアンサー
    • MySQL
  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • Access 2000 サブクエリとJOIN

    Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目    1|  1|りんご    2|  2|ぶどう    3|  3|みかん    4|  4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。

  • MySQLでLEFT JOIN

    MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id

    • ベストアンサー
    • MySQL
  • 同じサブクエリが複数出てくるのでまとめたい

    SELECT a.num b.num FROM   サブクエリA(いろんな処理 WHERE a_id=ANY(サブクエリC(いろんな処理)) ) AS a,   サブクエリB(いろいろ処理 WHERE b_id=ANY(サブクエリD(いろんな処理)) ) AS b このような処理をしているのですが、サブクエリCとサブクエリDは一字一句違わない全く同じ処理をしています。 2回全く同じ処理をするのは処理コストが無駄にかかりますし、同じ内容を示す表記が2度出てくるのは保守性も悪くします。 サブクエリCとDを共通化して一つにまとめる方法はありますでしょうか。

    • ベストアンサー
    • MySQL
  • JOINでの結果取得 サブクエリをJOINする

    WordPressのデータベースでテーブル2つを結合して以下の情報を取得しようとしています メール(wp_users.user_email)|名前(wp_usermeta.meta_value)|登録日時(wp_users.user_registered ) 123@a.com,山田,2012-06-17 12:33:44 456@b.jp,田中,2012-06-21 07:26:54 789@c.ne.jp,\N,2009-08-11 12:19:00 1234@d.ne.jp,\N,2009-08-11 12:19:00 321@x.ne.jp,\N,2009-08-11 12:19:00 ・ユーザーはwp_usersテーブルにeメール情報(user_email)を必ず持ている ・ユーザーの名前はwp_usermetaテーブルのwp_usermeta.meta_keyがuser_nameなレコードに保存されているが、ユーザーによってあるものとないものがある。無い場合はNULLにする。 テーブル構造は添付した画像に記載されています。 ■ユーザ数 mysql> SELECT COUNT(*) FROM wp_users; 18290 まずwp_usersとwp_usermetaをLEFT JOINしてmeta_key = 'user_name'なレコードを取得しようとしましたが、user_nameを持っているユーザーのみしか取得できませんでした。 ■user_nameを持っていないユーザーが取得できない SELECT u.user_email, m.meta_value FROM wp_users AS u LEFT JOIN wp_usermeta AS m ON u.ID = m.user_id WHERE m.meta_key = 'user_name'\G 2075 rows in set (0.00 sec) 次にサブクエリをJOINしました。結果は正しいものを取得できたのですが、実行時間が40秒以上かかってしまい実用性がありません。 ■欲しい結果(速度が遅い) SELECT u.user_email, a.meta_key, a.meta_value, u.user_registered FROM wp_users AS u LEFT JOIN (select * from wp_usermeta where meta_key = 'user_name') as a ON u.ID = a.user_id; 18290 rows in set (45.45 sec) この結果を取得できる、正しいSQLを教えてください。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • AccessにおいてフィールドがNULLの値を0に変換するには

    下記のようなSQLで件数を取得したいと考えています。 テーブルBの件数がNULLの場合、差がNULLになってしまいます。 このような場合、差を0にしたいです。 どのように修正したらよいでしょうか。 SELECT A.ID, (A.件数-B.件数) AS 差 FROM A LEFT JOIN B ON A.ID = B.ID;

  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください