AccessでのSQLについて教えてください。TABLE1にフィールドが3つあります。産地、果物名、果物価格。データの例は下記になります。


日本,カリン,100円○
アメリカ,アンズ,200円
フランス,アーモンド,300円
アメリカ,カリン,100円○
フランス,カリン,100円○
日本,カリン,500円×

抽出したいのは果物名です。ただし、条件が産地がアメリカ、フランス、日本の3国が登場する、AND 価格が全て同じものを抽出したいです。

上の例でいうと、カリンを抽出するとします。産地にアメリカ、フランスがあっても日本が無ければ抽出しません。同じようにカリンの果物価格が3国とも同じでなければ抽出しません。これを実現するにはどのようなSQLを書けばよいでしょうか?ちなみに産地は3国しかでてきません。必ずカリンが3国に登場して価格も同じでなければ抽出しません。

回答の条件
  • 1人2回まで
  • 登録:2009/07/29 15:10:44
  • 終了:2009/08/05 15:15:02

回答(5件)

id:degucho No.1

degucho回答回数251ベストアンサー獲得回数662009/07/29 15:58:20

ポイント20pt

いろいろあると思いますが、2000以降なら

SELECT J.果物名,J.果物価格
  FROM
((SELECT * FROM TABLE1 WHERE 産地='日本')     AS J
 JOIN 
 (SELECT * FROM TABLE1 WHERE 産地='アメリカ') AS U 
 ON  J.果物名   = U.果物名
 AND J.果物価格 = U.果物価格
) JOIN
(SELECT * FROM TABLE1 WHERE 産地='フランス')  AS F 
 ON  J.果物名   = F.果物名
 AND J.果物価格 = F.果物価格
WHERE J.果物名 IS NOT NULL
 

とかでいけるんじゃないでしょうか

id:akaired

すいません、上記を実行すると選択クエリでエラーがおこります。JOINはinner joinとなおして解決しましたが、今度はfrom句の構文エラーと表示されます。

2009/07/29 16:39:21
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/07/29 17:47:14

ポイント20pt

ベタな書き方ですが国名が3つだけという事ならば、

下記のようにすれば動作確認も楽だと思います。


ステップ1 - 3カ国だけに注目

SELECT T1.*, T2.*, T3.*
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
;

ステップ2 - 果物名を加える

SELECT T1.*, T2.*, T3.*
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
    AND (T1.果物名 = T2.果物名) AND (T1.果物名 = T3.果物名)
;

ステップ3 - 果物価格を加える

SELECT T1.*, T2.*, T3.*
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
    AND (T1.果物名 = T2.果物名) AND (T1.果物名 = T3.果物名)
    AND (T1.果物価格 = T2.果物価格) AND (T1.果物価格 = T3.果物価格)
;

最終調整 - 果物名だけを出力

SELECT T1.果物名
FROM table1 AS T1, table1 AS T2, table1 AS T3
WHERE (T1.産地 = "アメリカ") AND (T2.産地 = "フランス") AND (T3.産地 = "日本")
    AND (T1.果物名 = T2.果物名) AND (T1.果物名 = T3.果物名)
    AND (T1.果物価格 = T2.果物価格) AND (T1.果物価格 = T3.果物価格)
;
id:Hibi No.3

Hibi回答回数178ベストアンサー獲得回数22009/07/29 17:59:33

ポイント20pt

間違っていたらごめんなさい。多分、下記SQLで良いかと。

もうちょっとスマートにすることができると思いますが。

SELECT TABLE1.果物価格 , TABLE1.果物名

FROM ((

TABLE1

LEFT JOIN (

SELECT TABLE1.*

FROM TABLE1

WHERE TABLE1.産地="日本") AS Japan

ON (TABLE1.果物価格 = Japan.果物価格) AND (TABLE1.果物名 = Japan.果物名)

)

LEFT JOIN (

SELECT TABLE1.*

FROM TABLE1

WHERE TABLE1.産地="アメリカ") AS USA

ON (TABLE1.果物価格 = USA.果物価格) AND (TABLE1.果物名 = USA.果物名)

)

LEFT JOIN (

SELECT TABLE1.*

FROM TABLE1

WHERE TABLE1.産地="フランス") AS France

ON (TABLE1.果物価格 = France.果物価格) AND (TABLE1.果物名 = France.果物名)

WHERE

Not (Japan.産地 IS Null OR USA.産地 IS Null OR France.産地 IS Null)

GROUP BY TABLE1.果物価格 , TABLE1.果物名

id:ken3memo No.4

ken3memo回答回数243ベストアンサー獲得回数752009/07/29 20:11:07

ポイント20pt

>ちなみに産地は3国しかでてきません

例外無しと決め付けて(いけない考えですが・・・)、

グループ化して カウントを3のデータだけ持ってくるとか?

[f:id:ken3memo:20090729200648j:image]

SELECT TABLE1.果物名, TABLE1.果物価格

FROM TABLE1

GROUP BY TABLE1.果物名, TABLE1.果物価格

HAVING (((Count(TABLE1.産地))=3));

産地を条件に入れて、

~~~~~~~~~~~~~~~~~~~~

SELECT TABLE1.果物名, TABLE1.果物価格

FROM TABLE1

WHERE (((TABLE1.産地)="日本")) OR (((TABLE1.産地)="アメリカ")) OR (((TABLE1.産地)="フランス"))

GROUP BY TABLE1.果物名, TABLE1.果物価格

HAVING (((Count(TABLE1.産地))=3));

のほうがいいのかなぁ。

でも、単純にカウント3なので、

このクエリだと

アメリカ カリン 100

アメリカ カリン 100

フランス カリン 100

と、日本が無いデータも3とカウントするから却下かなぁ。

以上、グループ化の案でした。

何かの参考となれば、幸いです。

id:HALSPECIAL No.5

HALSPECIAL回答回数407ベストアンサー獲得回数862009/07/29 23:16:30

ポイント20pt

SELECT QRY.[果物名], QRY.[果物価格]
FROM (
	SELECT DISTINCT [産地], [果物名], [果物価格]
	FROM [テーブル1]
) QRY
GROUP BY QRY.[果物名], QRY.[果物価格]
HAVING Sum(IIf(QRY.[産地]='アメリカ',1,IIf(QRY.[産地]='フランス',2,IIf(QRY.[産地]='日本',4,0))))=7

  • id:degucho
    joinはすみません(SQL Serverで試してたもので)
    改めてaccessでやってみたらコピーしてinner joinに変更で問題なく動作しています。
    JOINを連結しているので括弧の数がややこしいのですがあってますか?(最初のFROMの後ろとか)
    やってることは日本アメリカフランスのクエリをJOINしてるだけなので
    それぞれ段階を踏んで個別に作ってデザインビューで矢印をつなげれば確実かもしれません。
    また、今回の場合は
    WHERE J.果物名 IS NOT NULL
    は不要でした
  • id:kmond2
    回答#2の「最終調整」ではレコードが1つも選ばれないのですが‥‥
  • id:kn1967
    >kmond2 2009-07-30 13:00:45
    >回答#2の「最終調整」ではレコードが1つも選ばれないのですが‥‥

    Access2000で動作確認したものを貼り付けてあるので、
    1つも選ばれないとすれば、環境がおかしいかデータの作り方を間違ったのだろう。

    私kn1967の投稿に対し、いろいろコメントしてくれるのは結構だが、
    それなりに吟味して、筋道通したものにしてくれないか?

    言葉を間違うのは人間だから多少はしかたの無い事だが、
    自分のidと他人のidの区別すらつかなくなったりすることもあるし、
    まったく関係ない事を書いていたりもするし、おかしいだろ。

    直近では、これなんか誰の事を指してるのだ?
    http://q.hatena.ne.jp/1248916387#a938052
    >Proxyサーバと勘違いしている人

    正したい事があると言うのであれば、もう少し、がんばってくれよ。
  • id:kmond2
    > kn1967 2009-07-30 13:50:11
    > Access2000で動作確認したものを貼り付けてあるので、
    >1つも選ばれないとすれば、環境がおかしいかデータの作り方を間違ったのだろう。

    ご自身の環境が絶対だとお思いなのでしょうか。
    Access2007では大文字と小文字を区別することができるので、そのSQLでは動かない可能性があるのです。
    それとも、Access2007 は「環境がおかしい」に含まれるというのでしょうか?

    それから、別件のコメントを書き込まないようにしてください。回答者の方にご迷惑をおかけしますので。
    私を批判したいのであれば直接的にお願いします。
  • id:kn1967
    >kmond2 2009-07-30 16:58:32
    >Access2007では大文字と小文字を区別することができるので、そのSQLでは動かない可能性があるのです。

    どこの部分の大文字小文字の話をしてるんだ?

    テーブル名が小文字だからおかしくなるとか言ってんじゃないよね?
    それならステップ1の段階でダメだろ。
    そもそも実際のテーブル名にあわせるだろ。

    データの中身か?
    WHERE条件の部分は、他の方のSQL同様に「=」で比較してるけど、これは私だけじゃないぞ。

    私に対して、何度も言ってたよね「言い訳」とかって。
    どこから適当に引っ張ってきた言葉か知らんが、言い訳にしても苦しすぎるぞ。

    >回答者の方にご迷惑

    それは貴殿の書き込みだ。今一度繰り返そう。
    「それなりに吟味して、筋道通したものにしてくれないか?」
  • id:HALSPECIAL
    HALSPECIAL 2009/07/31 10:06:39
    デフォルトインストールのAccess2007 でも普通に動作しましたよ。

    手間をかけて、
    バイナリフィールドを作成
    http://www.f3.dion.ne.jp/~element/msaccess/AcTipsBinaryField.html
    すれば大文字小文字の区別をすることができると思いますが、
    Access2007も「区別しない」が基本になっていると思います。

この質問への反応(ブックマークコメント)

トラックバック

  • 回答が1つあいていると・・・ http://q.hatena.ne.jp/1248847842 の質問、回答が1つあいていた・・・ので、別の方法を強引に考えてみた。※けど失敗した話。 産地 果物名 果物価格 日本 カリン 1
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません