タイトルのように、Aテーブルにあるが、Bテーブルまたは、Cテーブルにあれば抽出しないWhere文を作成したいのですが、ご教授ください。尚、Dテーブルより名称を抽出したいです。
select a.項目1,a.項目2,d.名称 from Aテーブル a,Bテーブル b,Cテーブル c,Dテーブル d where a.条件1 = 1 and d.項目1 = a.項目1 and d.項目2 = a.項目2 NOT((b.項目1 = a.項目1 and b.項目2 = a.項目2 and 条件2 = 0) or (c.項目1 = a.項目1 and c.項目2 = a.項目2 and 条件2 = 0))
上のselect文ではダメでしょうか?
No.1ベストアンサー
- 回答日時:
結論から言うと、質問文のSQLでは抽出できません。
理由ですが、Aテーブルにあって、BテーブルまたはCテーブルに無いような条件の場合はテーブルの結合条件として、外部結合を使う必要がありますが、質問文のSQLでは内部結合を使っています。内部結合を使うと、結合したテーブルの何れかにデータが欠如していると、該当のAテーブルのレコード情報は抽出されません。しかし、外部結合を使えば、Aテーブルのみに存在する情報も抽出可能です。
一般に、FROM句にテーブル名を並べるか、キーワードINNER JOINを使った場合は内部結合(ただし、OracleではFROM句にテーブル名を並べても外部結合として扱う記述方法が存在します。)、LEFT JOINもしくはRIGHT JOINを使うと外部結合となります。
質問文のSQLからはそれぞれのテーブルの結合条件が不明なため、そのまま動作するSQLを回答することはできませんが、仮にテーブルA〜Dのキー項目が項目1で、全テーブルの結合条件が項目1の場合、以下のようなSQLで結合できます。
SELECT a.項目1, d.名称
FROM Aテーブル a
LEFT JOIN Bテーブル ON a.項目1 = b.項目1
LEFT JOIN Cテーブル ON a.項目1 = c.項目1
LEFT JOIN Dテーブル ON a.項目1 = d.項目1
WHERE b.項目1 IS NULL OR c.項目1 IS NULL
LEFT JOINをベースに外部結合(LEFT JOIN)しているので、Bテーブル、またはCテーブルに該当の情報がなくても情報が抽出されます。また、Aテーブルに情報が存在し、Bテーブルに情報が存在しない場合、Bテーブルに関連する情報は全てNULLになるため「b.項目1 IS NULL」とすることで、「Aテーブルに存在し、Bテーブルに存在しない」データを抽出できます。同様にして「c.項目1 IS NULL」とすると、Cテーブルには存在しない情報が抽出できます。
なお、SQLは使用するSQLサーバの種類やバージョンによって動いたり、動かなかったりします。質問するときは使用するSQLサーバの種類とバージョン(Oracle 11g、Postgresql 9.6など)も記載していただけると、より正確なSQLを回答できます。
さっそくのご回答ありがとうございます。
まだ初心者なので、SQLサーバの種類やバージョンは覚えておりません。済みません。
項目1はキー項目ではないので、
SELECT a.項目1,a.項目2, d.名称
FROM Aテーブル a
LEFT JOIN Bテーブル ON a.項目1 = b.項目1 and a.項目2 = b.項目2
LEFT JOIN Cテーブル ON a.項目1 = c.項目1 and a.項目2 = b.項目2
LEFT JOIN Dテーブル ON a.項目1 = d.項目1 and a.項目2 = b.項目2
WHERE b.項目1 IS NULL OR c.項目1 IS NULL
以上の書き方でもよろしいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSでテーブルをコピーしよ...
-
最新日のデータのみ抽出するク...
-
2つのテーブルに共通するレコ...
-
Microsoft Access 「Form」のボ...
-
Accessのリンクされたテーブル...
-
access vbaにてテンポラリーテ...
-
Acccessで2つのテーブルから1...
-
Accessで表計算のMatch関数のよ...
-
COBOLでHEXを印字する
-
Accessでリストの並び順を変更...
-
MDBファイルを比較するツール(...
-
アクセスのクエリで集計
-
ACCESSユニオンクエリから新テ...
-
外部MDBのリンクテーブルの...
-
クエリで編集できるようにした...
-
Accessのテーブルで、リンク?...
-
アクセス2000でのリンク先...
-
access2000・・テーブルをデー...
-
アクセスVBA現在開いている全て...
-
accessのテーブルを閉じたとき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つのテーブルに共通するレコ...
-
最新日のデータのみ抽出するク...
-
ACCESSユニオンクエリから新テ...
-
Accessのリンクされたテーブル...
-
テーブルに表示されているもの...
-
ACCESSでテーブルをコピーしよ...
-
access vbaにてテンポラリーテ...
-
Accessでリストの並び順を変更...
-
Acccessで2つのテーブルから1...
-
Accessのテーブルで、リンク?...
-
ACCESS テーブルを見比...
-
クエリで同一テーブルの複数回...
-
ACCESS テーブルを見比...
-
accessのテーブルを閉じたとき...
-
Microsoft Access 「Form」のボ...
-
AccessVBAで任意の複数リンクテ...
-
アクセス2016 チェックボックス...
-
アクセス 部分一致の抽出
-
accessエラー回避について
-
Accesss テーブルの最終更新日...
おすすめ情報