Microsoft Access 掲示板

ACCESSのサブクエリについて

12 コメント
views
4 フォロー

地域 ID 収入
東京 1 100
東京 2 50
東京 3 50
東京 4 60
大阪 1 120
大阪 2 80
大阪 3 20
札幌 1 90
札幌 2 70
札幌 3 60
札幌 4 50

ACCESSのサブクエリにについて教えてください。

in(select 地域 from テーブル1 where 収入>=100)

この条件で、IDの1が、100以上を追加したいのです。

検索結果が、

東京 1 100
東京 2 50
東京 3 50
東京 4 60
大阪 1 120
大阪 2 80
大阪 3 20

こんな結果にしたいのですが、どのように記載したらいいのでしょうか?
お手数ですが、ご教示してください。
よろしくお願いします。

naonao
作成: 2020/01/07 (火) 19:10:00
通報 ...
1
hatena 2020/01/07 (火) 20:33:59 修正

in(select 地域 from テーブル1 where 収入>=100)

この条件で、IDの1が、100以上を追加したいのです。

下記のようなことでしょうか。

In (select 地域 from テーブル1 where ID=1 and 収入>=100)
2
naonao 2020/01/08 (水) 12:07:39 e0b05@0d7bf

ありがとうございます。できました。
また、利用方法がわからず、別のところに書き込んでしまいました。申し訳ありません。

このSQL文に条件を追加したいのですが、
IDの2の収入が、60以上のときですが、下記にすると、何も表示されません。

In (select 地域 from テーブル1 where (ID=1 and 収入>=100) and (ID=2 and 収入>=60))

クエリのグリットに
In (select 地域 from テーブル1 where (ID=1 and 収入>=100))

In (select 地域 from テーブル1 where  (ID=2 and 収入>=60))
一行加えると全部表示されます。

大阪 1 120
大阪 2 80
大阪 3 20

このような結果を抽出するにはどのように記載するのでしょうか?

お手数ですが、重ねて、ご教示をお願いします。

3

IDの2の収入が、60以上のときですが、下記にすると、何も表示されません。

In (select 地域 from テーブル1 where (ID=1 and 収入>=100) and (ID=2 and 収入>=60))

間の and を or に変更してください。

In (select 地域 from テーブル1 where (ID=1 and 収入>=100) or (ID=2 and 収入>=60))
4
naonao 2020/01/08 (水) 16:11:08 e0b05@0d7bf

回答ありがとうございます。
IDが1で収入が100以上、かつ、IDが2で、収入が60以上と書きたいのです。
このSQL文ですと、全データが表示されます。
本当にお手数ですけど、ご教示おねがいします。

5
名前なし 2020/01/08 (水) 16:44:15 4451d@e046e

通常、抽出は単一のレコードに対してそれが持つ各フィールドの値を条件にするものですよね
IDが1かつIDが2なんてレコードは存在しないので質問の内容を実現するのはめちゃめちゃ面倒です
ACCESSならDLOOKUPで[地域]が両方とも見つかる(NULLが1つもない)で出せば簡単に組めますが速度的な問題が起きそうな気もします

面倒なことをしようとしてるので、なぜそれをしたいかがあれば適切な答えも出ると思います

6
naonao 2020/01/08 (水) 17:01:39 e0b05@0d7bf

回答ありがとうございあます。

地域⇒グループ

ID(社員ID) 1(社員番号)

収入⇒収入(そのまま)

社員ID 1 (社歴が一番長い人) の収入が、100万円以上 かつ 社員ID 2(社歴が二番目に長い人)の収入が、60万円以上の地域を抽出したいのです。

大阪 1 120
大阪 2 80
大阪 3 20

そうすると、上のようになるはずなのです。
これは、サブクエリでは、できないのでしょうか?

7

これは、サブクエリでは、できないのでしょうか?

出来ます。

ですが、、、提示いただいた表が
履歴を管理しているテーブルのデータだとしたら
{ 地域 + ID } で行がユニーク( 固有の値 )にならない
という可能性すらありますから

次回からは、情報を小出しにせず
主キーや インデックス、データ型 についての情報も含め、
要件を丁寧に説明なさることをおすすめします。

■ { 地域 + ID } で行がユニークになる場合

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
    GROUP BY 地域
    HAVING Count(1) = 2
);

■ { 地域 + ID } で行がユニークにならない場合

SELECT t.* FROM テーブル1 t
INNER JOIN
(
    SELECT 地域
    FROM 
    ( 
        SELECT DISTINCT 地域, ID
        FROM テーブル1
        WHERE ( ID = 1 And 収入 >= 100 )
           OR ( ID = 2 And 収入 >= 60 )
    ) tmp
    GROUP BY 地域
    HAVING Count(1) = 2
) q
ON t.地域 = q.地域 ;
8
naonao 2020/01/08 (水) 18:27:52 e0b05@0d7bf

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

9
naonao 2020/01/08 (水) 20:11:09 e0b05@0d7bf

無礼を承知でもう一度質問します。

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
    GROUP BY 地域
    HAVING Count(1) = 2
);

このSQL文に再度条件を加える場合です。

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
     OR ( ID = 3 And 収入 >= 20 )
    GROUP BY 地域
    HAVING Count(1) = 2
);

この用にすると動くだろうと安直に思ってましたが、構文エラーになります。

単純に条件を重ねても動かないのはわかりました。

もう一度、ご教示お願いします。

地域⇒文字型
ID、収入⇒数値型
主キーは、別にあります。18桁の文字列です

よろしくお願いしあます。

10

この用にすると動くだろうと安直に思ってましたが、構文エラーになります。

SQL文中で使用する空白は
全角スペースを混在させず、全て半角スペースで統一して下さい。

また、WHERE句の条件を3つにした場合は
地域毎に抽出されたデータの行数 が 3 になっているかを
チェックする必要がありますから
HAVING句の絞り込み条件を Count(1) = 3 に変更しましょう。

SELECT * FROM テーブル1
WHERE 地域 IN
(
    SELECT 地域 FROM テーブル1
    WHERE ( ID = 1 And 収入 >= 100 )
       OR ( ID = 2 And 収入 >= 60 )
       OR ( ID = 3 And 収入 >= 20 )
    GROUP BY 地域
    HAVING Count(1) = 3
);
11
naonao 2020/01/09 (木) 11:19:19 10f03@ea3fc

mayu様

できました。
本当に感謝申し上げます。
本当にありがとうございました。

12

mayu様
できました。
本当に感謝申し上げます。
本当にありがとうございました。