こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Accessの内部結合

こんにちは。

Accessでcateテーブルとgoodsテーブルがあります。
select * from goods inner join cate on goods.cateid = cate.id;

クエリデザインで、テーブルとテーブルを結合して上記のようなSQLができました。
これは動作することを確認しました。

SQLビューで下記のようなSQLを書きました。
select * from goods inner join cate on left(goods.cateid,5) = cate.id;

しかしながら、動きませんでした。

VBAを使わずに、Accessの標準のクエリデザインから上記のようなSQLを実行させることは可能でしょうか?

クエリデザインでselect left(cateid,5) as cateid from goodsというTESTクエリをつくり、TESTクエリとcateテーブルとジョインさせれば解決しそうなことはわかるのですが・・・

宜しくお願いします。

投稿日時 - 2012-09-27 18:07:34

QNo.7720039

暇なときに回答ください

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

クエリ1を作ります
SELECT Left(cateid,3) AS xx, Goods.*
FROM Goods

このクエリ1とCate テーブルを繋げて
SELECT [クエリ1].*
FROM クエリ1 INNER JOIN Cate ON [クエリ1].xx = Cate.ID
やれば結果が得られるかと思います。

ひとつにまとめるのはクエリのデザインビューでは限界ですが
SQLビューでは、このようになります。

SELECT T2.*
FROM
(SELECT Left(T1.cateid,3) AS xx, T1.* FROM Goods AS T1)
AS T2
INNER JOIN Cate ON T2.xx = Cate.ID


かな?

投稿日時 - 2012-09-28 22:26:14

お礼

ありがとうございます!無事に解決しました!感謝感謝です!

投稿日時 - 2012-10-09 22:56:14

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> しかしながら、動きませんでした。

goodsテーブルのcateid及びcateテーブルのidは、数値型なのでは
ないでしょうか。
(この推測が正しければ、「型が一致しません」というエラーが出ていた
 と思います)

提示のSQL文を、以下のように改修してみてください:

<現在>
select * from goods inner join cate on left(goods.cateid,5) = cate.id;

<修正>
select * from goods inner join cate on left(goods.cateid,5) = CStr(cate.id);


【解説】
今回使われたLeft関数は、第1引数に数値を指定した場合でも、
戻り値としては文字列型の値を返します。
そのため、
  goods.cateid = cate.id
では「数値型 = 数値型」の比較となるので動作していたものが、
  left(goods.cateid) = cate.id
では「文字列型 = 数値型」の比較となるため、上述のエラーになる、
ということです。

これを回避するため、上記修正案では、データの型を文字列型に
変換するCStr関数を使用し、Where条件句の両辺をともに文字列型に
統一しています。

投稿日時 - 2012-09-29 09:23:08

お礼

ありがとうございます!無事に解決しました!感謝感謝です!

投稿日時 - 2012-10-09 22:56:04

ANo.2

select * from goods
where left(goods.cateid,5) in
(select id from cate)
;

ではどうでしょう?

デザインビューをSQLビューに切り替えて、上記をコピペしてから
デザインビューに戻してみてください。

投稿日時 - 2012-09-28 23:18:11

お礼

ありがとうございます!無事に解決しました!感謝感謝です!

投稿日時 - 2012-10-09 22:56:08

あなたにオススメの質問