![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
SQLで○○の値以外を持っているレコードを抽出しないという条件を作りたいのですが・・・
例えばこんな感じのテーブルがあったとします。
A1 A2 A3
-- -- --
AAA AA 111
AAA AB 111
AAA BB 222
BBB BB 111
CCC AA 111
CCC AC 555
DDD BB 222
EEE AA 111
EEE AC 333
EEE BB 777
A2の列に「BB」の値"しか"持っていないレコードを抽出したいのです
このテーブルで言えば返りは
BBB BB 111
DDD BB 222
と期待しています。
値BBのみしか持ってない条件の作り方を御教示願えませんでしょうか。
また、A2の値も文字数以外は規則性があるわけではないので無限パターンです。
詳しい方よろしくお願いします。
No.9ベストアンサー
- 回答日時:
> A1 A2 A3
> -- -- --
> AAA BB 222
> EEE BB 777
>
> が、どうして排除されるのか?
A2がBBでないレコードは
A1 A2 A3
-- -- --
AAA AA 111
AAA AB 111
CCC AA 111
CCC AC 555
EEE AA 111
EEE AC 333
ですよね。このレコードのA1のデータ(AAA,CCC,EEE)は排除したいという条件ですから、A1がAAAとEEEである
A1 A2 A3
-- -- --
AAA BB 222
EEE BB 777
は排除されます。
サブクエリでは、
select A1 from テーブル名 where A2<>'BB'
として、A2がBBでないレコードのA1のデータを取得しています。
条件がA1 not inなので、一方の条件がA2='BB'でもう一方がA2<>'BB'であっても問題はないですよね。
テーブル名を変えないとだめかもしれなかったので、「間違ってるかも」と書いたのですが、
select * from テーブル名 tablea where tablea.A2='BB' and tablea.A1 not in (select tableb.A1 from テーブル名 tableb where tableb.A2<>'BB')
ならわかりますか。(すいません。今回も実行はしていません。)
No.12
- 回答日時:
No.8です。
> ○select * from テーブル名 where A2='BB' and not exists (select A1 from テーブル名 where A2<>'BB')
違います。not exists で書くならこうです。
select * from テーブル名 t1 where t1.A2='BB' and not exists (select * from テーブル名 t2 where t1.A1 = t2.A1 and t2.A2<>'BB')
>なぜか(方言のせい?)
なので、使用しているDB名やバージョンは明記してください。
こちらには何もわかりません。
No.11
- 回答日時:
大前提としてA1とA2の組合せがユニークかどうか?でだいぶ違います。
もし上の条件を適用してよいなら
SELECT MAIN.A1,A2,A3 FROM テーブル AS MAIN
INNER JOIN (SELECT A1 FROM hoge GROUP BY A1 HAVING COUNT(*)=1) AS SUB
ON SUB.A1=MAIN.A1
WHERE MAIN.A2='BB'
みたいなのでもいけそうです。
No.8
- 回答日時:
横からすみません。
>A1 A2 A3
>-- -- --
>AAA BB 222
>EEE BB 777
>
>が、どうして排除されるのか?
ですが、
>A2の列に「BB」以外の値を持ったA1列データは排除して
という条件から、
AAAは
>AAA AA 111
>AAA AB 111
同じくEEEは
>EEE AA 111
>EEE AC 333
というA2が「BB」以外の値を持ったレコードが存在しているため排除する、ということではないのですか?
SQLも
>select * from テーブル名 where A2='BB' and A1 not in (select A1 from テーブル名 where A2<>'BB')
で問題はないと思います。
not existsの方が良さそうな気はしますが。
解説までしていただきありがとうございます
なぜか(方言のせい?)not inをnot existsに変えると構文エラーで動いてくれなくなりました。
○select * from テーブル名 where A2='BB' and A1 not in (select A1 from テーブル名 where A2<>'BB')
↓
×select * from テーブル名 where A2='BB' and A1 not exists (select A1 from テーブル名 where A2<>'BB')
○select * from テーブル名 where A2='BB' and not exists (select A1 from テーブル名 where A2<>'BB')
No.4
- 回答日時:
SELECT T1.A1, T1.A2, T1.A3
FROM テーブル AS T1 LEFT JOIN
(SELECT T21.A1, T21.A2
FROM テーブル AS T21
INNER JOIN テーブル AS T22
ON T21.A1 = T22.A1
WHERE T21.A2="BB" AND T22.A2<>"BB"
GROUP BY T21.A1, T21.A2) AS T2
ON T1.A2 = T2.A2 AND T1.A1 = T2.A1
WHERE T1.A2="BB" AND T2.A2 Is Null
サブクエリの部分は方言がありますから
動作しない環境もあります。
環境に合わせて修正してください。
Access 2007 で動作確認しています。
Access 2003 なら サブクエリ部分は
[SELECT ・・・].AS T2
だったかな?
なお、仕様がはっきりしなかったので、
FFF BB 111
FFF BB 222
GGG BB 333
GGG BB 333
このようなデータは、すべてのレコードが抽出されます。
※これを抽出しない場合は、かなり難しいかも。私は降ります。
No.3
- 回答日時:
> だから、何でAAAとEEEが対象にならないのか上記説明で表現出来ていますか?
できてますよね。だって、
> A2の列に「BB」以外の値を持ったA1列データは排除して
という条件が加わったのですから。
select * from テーブル名 where A2='BB' and A1 not in (select A1 from テーブル名 where A2<>'BB')
でどうでしょうか。実行していないので間違ってるかも。
考え方は、排除したいA1のデータをサブクエリで抽出して、A1がそのリストに含まれていないという条件をつけます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- 統計学 条件付き独立について 1 2023/06/26 07:50
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- 洋画 「トラ・トラ・トラ!」の字幕 3 2022/10/17 01:15
- 哲学 君もハードボイルドに生きてみないか 1 2022/10/12 16:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
Accessで在庫管理を
-
IFで条件を分岐させてのINSERT...
-
複数のテーブルから同じ条件で...
-
ビューで引数を使いたい
-
「マスタ」と「テーブル」の違...
-
2つのテーブルから条件に一致...
-
ACCESSのSQLで、NULLかNULLでな...
-
ACCESS2007 フォーム 「バリア...
-
2つの項目が重複するレコード...
-
SELECT文でのデッドロックに対...
-
数百万件レコードのdelete
-
非連結サブフォームのレコード...
-
Accessにインポートしたら並び...
-
[ BETWEEN ] vs [ >= AND <= ]
-
sqlserverで集計結果をUPDATEし...
-
Access 1レコードずつcsvで出力...
-
データの二重表示の原因
-
Accessで重複したデータを一件...
-
Accessの重複クエリで最小以外...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
ビューで引数を使いたい
-
IFで条件を分岐させてのINSERT...
-
Accessで在庫管理を
-
SQL 件数取得を速くしたい
-
2つのテーブルを結合して合計(...
-
二つの表の項目を比較して値を...
-
空のテーブルの判別
-
複数のテーブルから同じ条件で...
-
SQLの書き方
-
DB2 業種毎に連番をつけたいの...
-
select into句のトランザクショ...
-
大学でSQLの授業があるのですが...
-
Access関数について クエリで空...
-
リレーションシップ 全データを...
-
Insert Into Select での重複に...
-
Sql文のUpdateと副問い合わせで...
-
別のテーブルの値を抽出条件と...
-
SQL 重複 条件を付けて抽出したい
-
SQLで○○の値以外を持っているレ...
おすすめ情報