プロが教えるわが家の防犯対策術!

本来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で上手く表示できるようにするにはどうしたらよいのでしょうか

A 回答 (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は省略表記なので
どちらも間違いではありません。
    • good
    • 0
この回答へのお礼

>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は外部結合を()でネストしないとだめっぽいですね。

ありがとうございました。

(質問のクローズは暫く待ちます。)

お礼日時:2007/08/13 21:31

CASE文はサポートされていなくて、switch式かiif式で書くしかないようですね。



iif(d.ワイドホワイト=0,'TRUE','False')
    • good
    • 0

Access では


left outer join ではなく
LEFT JOIN です。
    • good
    • 0
この回答へのお礼

参考書を見る限り、OUTERは不要のようですね。しかし、修正してみましたが「FROM句の構文エラーです」が表示されます。

お礼日時:2007/08/13 18:29

>Accessで外部結合したいのですが出来ません



「できない」といった曖昧な説明でなく、何がどううまく行かないのか、何を質問したいのか具体的に説明してください。

>2行目のDecodeはAccessでは使えないので

「外部結合」というよりは、decode関数の代替手段の質問ですか?

ACCESSに付いて詳しくないですが、case式は未実装で、

IIf(式,真の場合の値,偽の場合の値)

という関数があるらしいことは、ここのようなQ&Aサイトで見かけますが?
    • good
    • 0
この回答へのお礼

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関数の代替ではなく、外部結合が出来ないことを悩んでいます。

お礼日時:2007/08/13 07:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!