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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
ビューで引数を使いたい
-
IFで条件を分岐させてのINSERT...
-
select into句のトランザクショ...
-
INSERT文でサブクエリ
-
複数のテーブルから同じ条件で...
-
「マスタ」と「テーブル」の違...
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
エクスポート時の改行コードに...
-
mysql IN句に1データだけ指定...
-
重複するキーから一番古い年月...
-
SELECT時の行ロックの必要性に...
-
ACCESS2007 フォーム 「バリア...
-
コンボボックスで入力したもの...
-
Access VBA [リモートサーバー...
-
ACCESSのODBCリンクテーブルに...
-
大きなテーブルに対する問い合...
-
SELECT文でのデッドロックに対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
ビューで引数を使いたい
-
IFで条件を分岐させてのINSERT...
-
SQL 件数取得を速くしたい
-
複数のテーブルから同じ条件で...
-
Accessで在庫管理を
-
select into句のトランザクショ...
-
INSERT文でサブクエリ
-
SQL文を教えて下さい
-
Access関数について クエリで空...
-
DB2 業種毎に連番をつけたいの...
-
Insert Into Select での重複に...
-
ACCESSの作り方
-
リレーションシップ 全データを...
-
空のテーブルの判別
-
SQLで○○の値以外を持っているレ...
-
SQL文の作成でなやんでいます。
-
二つの表の項目を比較して値を...
-
(初心者です)パフォーマンス...
-
大学でSQLの授業があるのですが...
おすすめ情報