基本的なことなのかもしれませんが・・・
AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。
Aテーブルを抽出したい時に、抽出条件は以下です。
・Bテーブルのステータスが1であれば抽出
・Bテーブルのステータスが0であれば非抽出
・Bテーブルにデータがなければ抽出
INNER JOINだとデータがない時に抽出できないし、
WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。
SELECTした結果に対して条件つけて抽出する手も思いつきましたが
もっと美しいSQLがあれば教えてもらえないでしょうか。
環境はSQLServerです。よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
片方のテーブルにデータがなくても抽出したい場合は
LEFT JOINなどの外部結合を使います。
するとBテーブルにデータがないと、Bテーブルを参照する値がNULLで帰ってきます。
その上で、WHERE STAT=1 OR STAT=NULL
で抽出できます。
AにDATAとID、BにIDとSTATとして、Bでつながってると
以下で検索できます。
SELECT A.DATA, A.ID, B.STAT
FROM A LEFT JOIN B ON A.ID=B.ID
WHERE B.STAT=1 OR B.STAT IS NULL
ありがとうございます。
ただ、LEFT JOINすると、BのデータはNULLで返ってきますが、Aのデータは抽出できてしまいました。
Bのステータスを条件として、否であればAのデータもろとも抽出しないという風にしたいのです。
No.3
- 回答日時:
Aが Bが
ID NAME ID STAT
1 ABC 1 0
2 DEF 3 1
3 XYZ
のときに
ID NAME STAT
2 NULL NULL
3 XYZ 1
とするのでしょうか?
そうするなら、INNER JOINでAとBを結合して、
それをLEFT JOINすればいけそうです。
SELECT A.ID, C.DATA, C.STAT FROM A
LEFT JOIN (
SELECT DATA, A.ID ID, STAT FROM A
INNER JOIN B ON A.ID=B.ID
) C
ON A.ID=C.ID
WHERE C.STAT=1 OR C.STAT IS NULL
ありがとうございます!
INNER JOINしたものをLEFT JOIN。。。
僕の概念には全くなかった方法です。勉強になります。
No.4
- 回答日時:
一般的手法である外部結合(LEFT-JOIN)での場合
select A.*
from A left join B on (A.関連番号=B.関連番号)
where B.関連番号 is NULL or B.ステータス=1
オマケですが..
外部結合なんかなくたって..その1
select A.* from A,B where B.関連番号=A.関連番号 and B.ステータス=1
union all
select A.* from A where not exists(select 1 from B where B.関連番号=A.関連番号)
外部結合なんかなくたって..その2
select A.* from A
where not exists(select 1 from B where B.関連番号=A.関連番号 and B.ステータス=0)
ありがとうございます!
そうか、LEFT JOINしてそれに対してWHERE句で条件加えれば。
UNIONに関してはすっぽり抜け落ちてました。。。
NOT EXISTSなんてのがあるんですね。
勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- Excel(エクセル) Excelでデータを抽出するに良い方法 9 2023/02/06 12:42
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Excel(エクセル) Excelの関数でこんな処理ができますか 1 2023/02/08 13:46
- システム 帳票出力を行う単体テストのテストデータが作成できません 2 2023/08/26 21:26
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
Access の SQL で、Aがなかったら、Bを抽出したい
Access(アクセス)
-
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
SQL Left Join で重複を排除するには
SQL Server
-
-
4
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
5
データ無し時は空白行にしたい【SQLITE】
その他(データベース)
-
6
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
7
GROUP BYを行った後に結合したい。
Oracle
-
8
単一グループのグループ関数ではありません。
Oracle
-
9
テーブルの列数を調べたい
MySQL
-
10
SQL文で、合計が0のレコードを表示させないようにしたい。
SQL Server
-
11
Where句のNot条件をAnd条件にしたい!
Oracle
-
12
テーブルタグの中にdivを含めてはダメ?
HTML・CSS
-
13
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
14
二つの表の項目を比較して値を取得するSQL
その他(データベース)
-
15
hiddenのvalueの値を変えたい
JavaScript
-
16
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
17
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
18
SELECT 文 GROUP での1件目を取得
SQL Server
-
19
frxファイルの役目
Visual Basic(VBA)
-
20
3つ以上のテーブルをUNIONするのは現時的でないでしょうか?
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データがあれば○○なければのSQL
-
重複した複数のレコードを1レ...
-
ACCESSのクエリ、SQLに変数を使...
-
Access vbaで重複レコードの削...
-
ACCESS DCOUNTの抽出条件について
-
access追加クエリーでform入力...
-
オートナンバー型の数字を振り...
-
ACCESS VBAでテーブル内の特定...
-
ACCESSで実行時エラー3008
-
【access】複数のフィールドの...
-
抽出条件でデータ型が一致しま...
-
もしかして
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
CloseとDisposeの違い
-
VBAでループ内で使う変数名を可...
-
エクセルVBAで、MsgBox やInput...
-
Do~Loopした回数をカウントしたい
-
switch の範囲指定
-
VBAでセルに値が入力されるまで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データがあれば○○なければのSQL
-
【access】複数のフィールドの...
-
ACCESS VBAでテーブル内の特定...
-
Access vbaで重複レコードの削...
-
ACCESS DCOUNTの抽出条件について
-
Accessで縦と横を入れ替えたい
-
VBAでテーブル名とカラム名を動...
-
DataGridViewで複数条件の抽出...
-
Access から Excelのシートをイ...
-
重複した複数のレコードを1レ...
-
DAOでSQLServerに接続し、LeftJ...
-
SQLServer→Access インポート
-
ACCESSで実行時エラー3008
-
sql文で削除クエリを書く
-
別のaccessファイルからデータ...
-
access追加クエリーでform入力...
-
抽出条件でデータ型が一致しま...
-
【PHP/MySQL】コード上で生成...
-
Accessリンクするテーブルが見...
-
ACCESSで購入回数を表示する方...
おすすめ情報