タイトルのように、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で質問しましょう!
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
2つのテーブルに共通するレコ...
-
Accessのリンクされたテーブル...
-
access vbaにてテンポラリーテ...
-
ACCESSでテーブルをコピーしよ...
-
access2000・・テーブルをデー...
-
ACCESSで出欠リストを管理する
-
ACCESSユニオンクエリから新テ...
-
Accessのテーブルで、リンク?...
-
テーブルに表示されているもの...
-
最新日のデータのみ抽出するク...
-
クエリで編集できるようにした...
-
accessのテーブルを閉じたとき...
-
Acccessで2つのテーブルから1...
-
アクセス2016 チェックボックス...
-
テーブル内の文字数が多くても...
-
Accessでリストの並び順を変更...
-
アクセス 部分一致の抽出
-
アクセスでフォームが消える(...
-
Accessでテーブルのリンクを範...
-
Access2010のリンクテーブルに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
2つのテーブルに共通するレコ...
-
ACCESSでテーブルをコピーしよ...
-
最新日のデータのみ抽出するク...
-
ACCESSユニオンクエリから新テ...
-
Accessのリンクされたテーブル...
-
access vbaにてテンポラリーテ...
-
テーブルに表示されているもの...
-
Accessのテーブルで、リンク?...
-
Acccessで2つのテーブルから1...
-
ACCESS テーブルを見比...
-
Accessでリストの並び順を変更...
-
Microsoft Access 「Form」のボ...
-
アクセス 部分一致の抽出
-
アクセス2016 チェックボックス...
-
クエリで同一テーブルの複数回...
-
ACCESS テーブルを見比...
-
access2000・・テーブルをデー...
-
accessエラー回避について
-
accessのテーブルを閉じたとき...
-
Accessのテーブルで、不可解な...
おすすめ情報