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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESS 一番最新の日付の金額...
-
インデックスの再構築の意味っ...
-
コンボボックスで入力したもの...
-
「マスタ」と「テーブル」の違...
-
sqlserverで集計結果をUPDATEし...
-
オラクルではできるのにSQLSERV...
-
実行時エラー3086 削除クエリ...
-
Accessでクエリを完了できませ...
-
シャープレジスター エラーコード
-
大きなテーブルに対する問い合...
-
ストアドをまたがるローカル一...
-
ACCESSのコンパイルエラーについて
-
mysql IN句に1データだけ指定...
-
エクセルでテーブルの最終行が...
-
sqlserverで対象のレコードを削...
-
主キーにインデックスは貼らな...
-
Inner join と Left joinの明...
-
AccessのSQLで、FROM句の構文エ...
-
エクセル
-
コマンドプロンプト エラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ビューで引数を使いたい
-
ACCESS 一番最新の日付の金額...
-
IFで条件を分岐させてのINSERT...
-
複数のテーブルから同じ条件で...
-
Insert Into Select での重複に...
-
Access関数について クエリで空...
-
INSERT文でサブクエリ
-
Accessで在庫管理を
-
SQLの書き方
-
SQL 件数取得を速くしたい
-
SQLで○○の値以外を持っているレ...
-
二つの表の項目を比較して値を...
-
空のテーブルの判別
-
カラム名の出力
-
DB2 業種毎に連番をつけたいの...
-
select into句のトランザクショ...
-
条件が混在しているSQLで値取得
-
大学でSQLの授業があるのですが...
-
2つのテーブルを結合して合計(...
-
Sql文のUpdateと副問い合わせで...
おすすめ情報