- ベストアンサー
Accessで外部結合
本来Access2002(+VB.NET2003)で開発しています。 Accessで外部結合したいのですが出来ません。 わからなかったので、Oracle10gExpressionEdutionで試してみました。 SQL> desc DVDデータ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- DVDナンバー NOT NULL VARCHAR2(10) 収録ID1 VARCHAR2(6) 収録ID2 VARCHAR2(6) 収録ID3 VARCHAR2(6) 収録ID4 VARCHAR2(6) ワイドホワイト NUMBER(1) 焼込済 NUMBER(1) レーベルプリント済 NUMBER(1) バックアップ NUMBER(1) SQL> desc 収録データ 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- 収録ID NOT NULL VARCHAR2(6) 番組名 VARCHAR2(100) 収録日 DATE 収録ステータス NUMBER(1) メモ VARCHAR2(100) のテーブル構造で select d.DVDナンバー , decode(d.ワイドホワイト , 0 , 'TRUE' , 1 , 'False' ), s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by 1 asc; をAccess2002のクエリで作成したいのですが、出来ません。 ※2行目のDecodeはAccessでは使えないので、 select d.DVDナンバー , d.ワイドホワイト, s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by d.DVDナンバー asc; ですかね。 Accessで上手く表示できるようにするにはどうしたらよいのでしょうか
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
select d.DVDナンバー , case when d.ワイドホワイト=0 then 'TRUE' else 'False' end as EXP01, s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from (((DVDデータ d join 収録データ s on s.収録ID = d.収録ID1) left outer join 収録データ s2 on s2.収録ID = d.収録ID2) left outer join 収録データ s3 on s3.収録ID = d.収録ID3) left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by 1 asc; な感じかな。 ちなみに、LEFT OUTER JOINが正式な表記で、LEFT JOINは省略表記なので どちらも間違いではありません。
その他の回答 (3)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
CASE文はサポートされていなくて、switch式かiif式で書くしかないようですね。 iif(d.ワイドホワイト=0,'TRUE','False')
- bonaron
- ベストアンサー率64% (482/745)
Access では left outer join ではなく LEFT JOIN です。
お礼
参考書を見る限り、OUTERは不要のようですね。しかし、修正してみましたが「FROM句の構文エラーです」が表示されます。
- chukenkenkou
- ベストアンサー率43% (833/1926)
>Accessで外部結合したいのですが出来ません 「できない」といった曖昧な説明でなく、何がどううまく行かないのか、何を質問したいのか具体的に説明してください。 >2行目のDecodeはAccessでは使えないので 「外部結合」というよりは、decode関数の代替手段の質問ですか? ACCESSに付いて詳しくないですが、case式は未実装で、 IIf(式,真の場合の値,偽の場合の値) という関数があるらしいことは、ここのようなQ&Aサイトで見かけますが?
お礼
Accessのクエリに select d.DVDナンバー , d.ワイドホワイト, s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1 left outer join 収録データ s2 on s2.収録ID = d.収録ID2 left outer join 収録データ s3 on s3.収録ID = d.収録ID3 left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by d.DVDナンバー asc; を貼り付け、クエリ実行すると、 「from DVDデータ d join 収録データ s on s.収録ID = d.収録ID1」 (下から5行目) のjoinが反転し 「FROM句の構文エラーです」が表示されます。 で、知りたいことはDecode関数の代替ではなく、外部結合が出来ないことを悩んでいます。
お礼
>case when d.ワイドホワイト=0 then 'TRUE' else 'False' end as EXP01, はエラーになってしまいましたが、 select d.DVDナンバー , d.ワイドホワイト, s.番組名 , s.収録日 , s2.番組名 , s2.収録日 , s3.番組名 , s3.収録日 , s4.番組名 , s4.収録日 from (((DVDデータ d inner join 収録データ s on s.収録ID = d.収録ID1) left outer join 収録データ s2 on s2.収録ID = d.収録ID2) left outer join 収録データ s3 on s3.収録ID = d.収録ID3) left outer join 収録データ s4 on s4.収録ID = d.収録ID4 order by 1 asc; で、外部結合できました。Accessは外部結合を()でネストしないとだめっぽいですね。 ありがとうございました。 (質問のクローズは暫く待ちます。)